我有一个pyspark Dataframe df:-
| 储存|列_苹果_BB|列_苹果_非BB|列_梨_BB|列_梨形_非BB|列_橙色_BB|颜色_橙色_非BB|列_葡萄_BB|颜色_葡萄色_非BB|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1个|二十八|二十四|二十四|三十二|二十六|五十四|六十|三十六|
| 第二章|十九|十二|二十四|十三|十个|二十四|二十九|十个|
我有另一个pyspark df df2
:-
| 储存|光动力治疗|水果|类型|
| - ------|- ------|- ------|- ------|
| 1个|1个|苹果|BB型|
| 1个|第二章|橙色|非BB|
| 1个|三个|梨|BB型|
| 1个|四个|葡萄|BB型|
| 1个|五个|苹果|BB型|
| 1个|六个|橙色|BB型|
| 第二章|1个|梨|非BB|
| 第二章|第二章|橙色|非BB|
| 第二章|三个|苹果|非BB|
应为pyspark df2
,其中列COL_VALUE
用于存储、水果,类型:-
| 储存|光动力治疗|水果|类型|列_值|
| - ------|- ------|- ------|- ------|- ------|
| 1个|1个|苹果|BB型|二十八|
| 1个|第二章|橙色|非BB|五十四|
| 1个|三个|梨|BB型|二十四|
| 1个|四个|葡萄|BB型|六十|
| 1个|五个|苹果|BB型|二十八|
| 1个|六个|橙色|BB型|二十六|
| 第二章|1个|梨|非BB|十三|
| 第二章|第二章|橙色|非BB|二十四|
| 第二章|三个|苹果|非BB|十二|
3条答案
按热度按时间cwdobuhd1#
9udxz4iz2#
如果你有Spark 3.2或更高版本,你可以使用类似的东西:
以获取数据集的“长”格式,然后使用
regex_extract
两次以从variable
列获取所需的信息。对于早期版本的Spark,请使用以下命令:
n3h0vuf23#
除了
melt
,您还可以在早期的Spark版本中使用stack
:创建与
df
中的"COL_FRUIT_TYPE"匹配的列:给出:
然后"取消旋转"第一个
df
:stack
函数的参数为:它将被"解透视"的"列"的数目(这里,它导出它将是len(df.columns) - 1
,因为我们将跳过STORE列);然后,如果只有column,value对,则它以col_name,value的形式获取这些对的列表。在这里,[("'{}', {}".format(c, str(c))) for c in df.columns[1:]]
部分从df中获取列,跳过第一列(STORE),然后为其余的每一列返回一个对,例如"COL_APPLE_BB",COL_APPLE_BB。最后,我将它们连接成一个逗号分隔的字符串(",".join()
),并将占位符{}
替换为该字符串。例如,stack
函数通常是如何调用的:"stack(2, 'COL_APPLE_BB', COL_APPLE_BB, 'COL_APPLE_NONBB', COL_APPLE_NONBB) as (fruit_type, COL_VALUE)"
unPivotDF.show(truncate=False)
输出:并将两者结合起来:
结果:
缺点是您需要枚举
stack
中的列名,如果我找到了自动完成此操作的方法,我将更新答案。编辑:我更新了
stack
函数的用法,这样它就可以自己派生列了。