【发布时间】:2020-06-19 21:34:34
【问题描述】:
我有一个 spark 数据框,看起来像这样,其中 expr 是 SQL/Hive 过滤器表达式。
+-----------------------------------------+
|expr |var1 |var2 |
+-------------------------+---------+-----+
|var1 > 7 |9 |0 |
|var1 > 7 |9 |0 |
|var1 > 7 |9 |0 |
|var1 > 7 |9 |0 |
|var1 = 3 AND var2 >= 0 |9 |0 |
|var1 = 3 AND var2 >= 0 |9 |0 |
|var1 = 3 AND var2 >= 0 |9 |0 |
|var1 = 3 AND var2 >= 0 |9 |0 |
|var1 = 2 AND var2 >= 0 |9 |0 |
+-------------------------+---------+-----+
我想将此数据帧转换为下面的数据帧,其中 flag 是在评估“expr”列中的表达式后找到的布尔值
+---------------------------------------------------+
|expr |var1 |var2 |flag |
+-------------------------+---------+-----+---------+
|var1 > 7 |9 |0 | True |
|var1 > 7 |9 |0 | True |
|var1 > 7 |9 |0 | True |
|var1 > 7 |9 |0 | True |
|var1 = 3 AND var2 >= 0 |9 |0 | . |
|var1 = 3 AND var2 >= 0 |9 |0 | . |
|var1 = 3 AND var2 >= 0 |9 |0 | . |
|var1 = 3 AND var2 >= 0 |9 |0 | . |
|var1 = 2 AND var2 >= 0 |9 |0 | . |
+-------------------------+---------+-----+---------+
我尝试过这样使用 expr 函数:
df.withColumn('flag', expr(col('expr')))
它会按预期失败,因为 expr 函数需要一个字符串作为参数。
我想到的另一个想法是制作一个 UDF 并将“expr”列的值传递给它,但这不允许我使用 pyspark 的 expr 函数,因为 UDF 都是非火花代码。
我的方法应该是什么?请问有什么建议吗?
【问题讨论】:
-
简短的回答你可以做到这一点,但使用窗口功能。您能否解释您要解决的更大问题或上传更好的示例数据,即一个包含一列到 groupby 的示例数据
-
如何使用窗口函数 @Dee 做到这一点。我认为UDF是唯一的解决方案。 Mappartition 将是另一种解决方案,可能会更快
-
我需要 OP 来解释真实数据是什么样的,或者这正在解决什么更大的问题
-
@Manish 现在查看我的答案
-
@Dee 假设我有两个数据帧,一个包含所有真实数据,另一个包含所有过滤规则(如上所述)以应用于真实数据。对于第一个数据帧中的每一行,只有一个过滤规则为真,根据该规则将为该行派生更多值。为此,我正在做的是在 2 个数据帧之间进行交叉连接(这是我在上面示例中显示的数据帧),然后尝试评估每一行的每个规则。让我知道解释是否清楚?
标签: apache-spark pyspark apache-spark-sql