我有一个包含以下内容的数据框:
TradeId|Source
ABC|"USD,333.123,20170605|USD,-789.444,20170605|GBP,1234.567,20150602"
我想旋转这些数据,使其变成下面的样子
TradeId|CCY|PV
ABC|USD|333.123
ABC|USD|-789.444
ABC|GBP|1234.567
“源”列中的CCY|PV|Date 三元组的数量不固定。我可以在 ArrayList 中做到这一点,但这需要在 JVM 中加载数据,这违背了 Spark 的全部意义。
假设我的 DataFrame 如下所示:
DataFrame tradesSnap = this.loadTradesSnap(reportRequest);
String tempTable = getTempTableName();
tradesSnap.registerTempTable(tempTable);
tradesSnap = tradesSnap.sqlContext().sql("SELECT TradeId, Source FROM " + tempTable);
最佳答案
如果您阅读databricks pivot ,它说“枢轴是一种聚合,其中一个(或一般情况下的多个)分组列将其不同的值转换为各个列。”
我猜这不是您想要的
我建议您使用withColumn和 functions以获得您想要的最终输出。考虑到 dataframe
是您所拥有的,您可以执行以下操作
+-------+----------------------------------------------------------------+
|TradeId|Source |
+-------+----------------------------------------------------------------+
|ABC |USD,333.123,20170605|USD,-789.444,20170605|GBP,1234.567,20150602|
+-------+----------------------------------------------------------------+
您可以使用 explode
、split
和 withColumn
执行以下操作以获得所需的输出
val explodedDF = dataframe.withColumn("Source", explode(split(col("Source"), "\\|")))
val finalDF = explodedDF.withColumn("CCY", split($"Source", ",")(0))
.withColumn("PV", split($"Source", ",")(1))
.withColumn("Date", split($"Source", ",")(2))
.drop("Source")
finalDF.show(false)
最终输出为
+-------+---+--------+--------+
|TradeId|CCY|PV |Date |
+-------+---+--------+--------+
|ABC |USD|333.123 |20170605|
|ABC |USD|-789.444|20170605|
|ABC |GBP|1234.567|20150602|
+-------+---+--------+--------+
希望这能解决您的问题
关于java - 旋转 DataFrame - Spark SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44521403/