【发布时间】:2021-03-08 10:45:02
【问题描述】:
我有一个数据框,我需要将同一组的行转换为列。基本上以这些为中心。下面是我的df。
+------------+-------+-----+-------+
|Customer |ID |unit |order |
+------------+-------+-----+-------+
|John |123 |00015|1 |
|John |123 |00016|2 |
|John |345 |00205|3 |
|John |345 |00206|4 |
|John |789 |00283|5 |
|John |789 |00284|6 |
+------------+-------+-----+-------+
我需要上述结果数据作为..
+--------+-------+--------+----------+--------+--------+-----------+--------+-------+----------+
|state | ID_1 | unit_1 |seq_num_1 | ID_2 | unit_2 | seq_num_2 | ID_3 |unit_3 |seq_num_3 |
+--------+-------+--------+----------+--------+--------+-----------+--------+-------+----------+
|John | 123 | 00015 | 1 | 345 | 00205 | 3 | 789 |00283 | 5 |
|John | 123 | 00016 | 2 | 345 | 00206 | 4 | 789 |00284 | 6 |
+--------+-------+--------+----------+--------+--------+-----------+--------+-------+----------+
我尝试了 groupBy 和 pivot() 函数,但它的抛出错误表明找到了大的枢轴值。有什么方法可以在不使用 pivot() 函数的情况下获得结果。非常感谢任何帮助。 谢谢。
【问题讨论】:
-
您可能在数据透视列中有超过 10000 个不同的值,这是默认的最大值 (
spark.sql.pivotMaxValues) -
@blackbishop.yes。这是正确的。有什么方法可以在不使用 pivot() 函数的情况下实现结果。
-
你可以随时增加这个值
spark.conf.set("spark.sql.pivotMaxValues", newMaxValue),但是pivot是一个资源密集型操作,你可能会遇到性能问题。 -
是的.. 这就是原因,正在寻找任何替代解决方案。赞赏
-
可能你可以用 pandas udf 做一个分组地图。似乎您会根据客户和 ID 进行分组,然后生成所需的数据框作为输出。 Spark“堆叠”它们并输出最终的 Spark 数据帧。您可能需要附上一些外部数据,但似乎应该可行。
标签: apache-spark hadoop pyspark apache-spark-sql pyspark-dataframes