如何使用Combinations表的行值对Clients表的值进行分类?
我决定创建一个组合表,以开发主行(客户表)的所有组合。
我计划检查客户行是否与组合表的一行一致,以将其分类为扇区B(组合表)。
我有这个流程,但Dtabricks返回错误:
for i,j in select_df.iterrows():
for u,v in dfCombinacionesDias.iterrows():
if (
(select_df["MONDAY"][i] == registro["LUNES"][u])
and (select_df["TUESDAY"][i] == registro["MARTES"][u])
and (select_df["WEDNESDAY"][i] == registro["MIERCOLES"][u])
and (select_df["THURSDAY"][i] == registro["JUEVES"][u])
and (select_df["FRIDAY"][i] == registro["VIERNES"][u])
and (select_df["SATURDAY"][i] == registro["SABADO"][u])
and (select_df["SUNDAY"][i] == registro["DOMINGO"][u])
):
Sector = "B"
else:
Sector = "A"
vSubSeq = "('{}','{}')".format(select_df["IDClient"][i],Sector)
sqlInsertSequence = "Insert into {0}.{1} values {2}".format(dSCHEMA, Table, vSubSeq,vdataDeltaPath)
print(sqlInsertSequence)
dfTables = spark.sql(sqlInsertSequence)
我添加图像与不同的表(客户端,组合和部门)
我想我需要一个for来循环一个表的行(组合表),以比较与客户端表中的一行,如果有一个匹配,我保存这个值在一个新的表(扇区表),显然会存在其他的for来循环客户端表。但我想知道一个算法,帮助查找表进行比较?
3条答案
按热度按时间nnt7mjpx1#
创意
我假设posted数据示例中的
"x"
像布尔触发器一样工作。那么,为什么不用True
替换它,用False
替换空的空间呢?之后,我们可以直接将逻辑运算符应用于数据。例如,客户的天数不符合"Sector B"
模式意味着什么?在示意图中,它表示any(client_days and not sector_b) is True
,如以下模型所示:如何在Pandas中实现
pandas 1.5.1
让我们在Pandas中对这个想法进行建模,就好像我们可以将
toPandas
应用于原始数据:在这种情况下,我们可以使用
dot
操作符,即。scalar product,记住加法和乘法对应于布尔数据情况下的或/与运算:PySpark实现
pyspark 3.4.1
假设由于某种原因我们不能使用
toPandas
。让我们重新组织数据,就像它们是PySpark DataFrame一样:我们如何实现仅限于这种数据类型的想法?首先,扇区的数据很小,我们可以按照一定的顺序(例如:接下来,我们可以将
map
应用于逻辑AND,然后将reduce
应用于逻辑OR,这为"Sector A"
情况提供了True
,否则为"False"
。之后,我们将pyspark.sql.functions
中的when
应用于map值:输出量:
一般情况
这只是一个幻想,它可能看起来像在一般情况下。假设我们有这些数据:
我们可以在这里看到3个扇区,大概是按优先级降序排列的,我们可能想在最后一帧中用它们的最后一个字母表示。
让我们在Pandas中实现:
现在在PySpark中,试图避免Pandas API。在这里,当应用
coalesce
时,我依赖于Python中的字典保留项目添加顺序的事实:bxgwgixi2#
我有这个流程,但Dtabricks返回错误:
返回错误例如,您正在使用
registro
,它似乎没有在您提供的代码提取中的任何地方定义。而且您没有有效地使用Databricks的功能。在DataFrames(Spark)的行上迭代效率很低,尤其是在嵌套循环中。
相反,您可以使用Spark的DataFrame APIs(来自Apache Spark API reference)来更有效地获得所需的结果。
作为一种替代方法,* 不 * 使用嵌套循环,您可以:
Combinations
DataFrame的列以匹配Clients
DataFrame的列。Clients
DataFrame和Combinations
DataFrame。连接后,
Clients
DataFrame中与Combinations
DataFrame匹配的任何行都将被分类为“B
“。没有匹配的字符串将是“A
“。它使用DataFrame转换和显式循环上的动作来对Spark DataFrame进行操作。
ddrv8njm3#
答案如下:
说明:此代码段有助于根据
Combinations
表中的匹配行对Clients
表中的值进行分类。它遍历Clients
表中的每一行,并根据星期几检查Combinations
表中是否有匹配的行。如果找到匹配,则将客户端分类为扇区“B”,否则将其分类为扇区“A”。分类结果存储在sector_df
DataFrame中。