【发布时间】:2019-12-09 00:45:12
【问题描述】:
我有以下示例数据框
fruit_list = ['apple', 'apple', 'orange', 'apple']
qty_list = [16, 2, 3, 1]
spark_df = spark.createDataFrame([(101, 'Mark', fruit_list, qty_list)], ['ID', 'name', 'fruit', 'qty'])
我想创建另一个列,其中包含类似于我使用熊猫groupby('fruit').sum() 实现的结果@
qty
fruits
apple 19
orange 3
上述结果可以任何形式(字符串、字典、元组列表...)存储在新列中。
我尝试了一种类似于以下方法但不起作用的方法
sum_cols = udf(lambda x: pd.DataFrame({'fruits': x[0], 'qty': x[1]}).groupby('fruits').sum())
spark_df.withColumn('Result', sum_cols(F.struct('fruit', 'qty'))).show()
结果数据框的一个示例可能是
+---+----+--------------------+-------------+-------------------------+
| ID|name| fruit| qty| Result|
+---+----+--------------------+-------------+-------------------------+
|101|Mark|[apple, apple, or...|[16, 2, 3, 1]|[(apple,19), (orange,3)] |
+---+----+--------------------+-------------+-------------------------+
您对我如何实现这一点有什么建议吗?
谢谢
编辑:在 Spark 2.4.3 上运行
【问题讨论】:
-
你想要的输出是什么?从描述中看不清楚,请明确显示。
-
感谢您的评论,完成!
-
什么版本的火花?如果是 spark 2.4+,你可以使用
array_zip。旧版本使这变得更加困难。 -
我在 2.4.3 上运行,您能否为我提供一个示例用法?
-
在我(有限的)经验中,我看到“本机”pyspark 代码的执行速度比 UDF(尤其是 UDAF)快 10 倍,即使在使用
explode时也是如此。只是要记住的事情..
标签: apache-spark pyspark apache-spark-sql