我的输入数据中有一组列,我基于这些列旋转。
在完成数据透视后,我遇到了列标题的问题。
输入数据
我的方法产生的输出-
预期的输出标头:
我需要输出的标题看起来像-
到目前为止为实现我得到的结果所做的步骤-
// *Load the data*
scala> val input_data =spark.read.option("header","true").option("inferschema","true").option("delimiter","\t").csv("s3://mybucket/data.tsv")
// *Filter the data where residentFlag column = T*
scala> val filtered_data = input_data.select("numericID","age","salary","gender","residentFlag").filter($"residentFlag".contains("T"))
// *Now we will the pivot the filtered data by each column*
scala> val pivotByAge = filtered_data.groupBy("age","numericID").pivot("age").agg(expr("coalesce(first(numericID),'-')")).drop("age")
// *Pivot the data by the second column named "salary"*
scala> val pivotBySalary = filtered_data.groupBy("salary","numericID").pivot("salary").agg(expr("coalesce(first(numericID),'-')")).drop("salary")
// *Join the above two dataframes based on the numericID*
scala> val intermediateDf = pivotByAge.join(pivotBySalary,"numericID")
// *Now pivot the filtered data on Step 2 on the third column named Gender*
scala> val pivotByGender = filtered_data.groupBy("gender","numericID").pivot("gender").agg(expr("coalesce(first(numericID),'-')")).drop("gender")
// *Join the above dataframe with the intermediateDf*
scala> val outputDF= pivotByGender.join(intermediateDf ,"numericID")
如何重命名旋转后生成的列?
有没有一种不同的方法可以基于多列(将近300列)来旋转数据集?
有没有改进性能的优化/建议?
2条答案
按热度按时间lsmepo6l1#
您可以考虑使用foldleft遍历to pivot列的列表,依次创建pivot dataframe、重命名生成的pivot列,然后是累计联接:
vsnjm48y2#
您可以这样做,并使用regex来简化