java - 旋转 DataFrame - Spark SQL

标签 java scala apache-spark apache-spark-sql pivot

我有一个包含以下内容的数据框:

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 ,它说“枢轴是一种聚合,其中一个(或一般情况下的多个)分组列将其不同的值转换为各个列。”我猜这不是您想要的

我建议您使用withColumnfunctions以获得您想要的最终输出。考虑到 dataframe 是您所拥有的,您可以执行以下操作

+-------+----------------------------------------------------------------+
|TradeId|Source                                                          |
+-------+----------------------------------------------------------------+
|ABC    |USD,333.123,20170605|USD,-789.444,20170605|GBP,1234.567,20150602|
+-------+----------------------------------------------------------------+

您可以使用 explodesplitwithColumn 执行以下操作以获得所需的输出

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/

相关文章:

scala - Spark数据帧中两行之间的差异

apache-spark - sparksql.sql.codegen 没有提供任何改进

java - 账户之间的多线程银行转账

scala - 在不输入 amm 的情况下运行 Ammonite scala 脚本

scala - 如何使用 Slick 在 SQLite 中启用外键验证

scala - 变换和展平析取列表

apache-spark - 如何使用Spark SQL作为内存数据库?

java - 加速java中的像素识别

java - 连续 `System.loadLibrary` 返回 `UnsatisfiedLinkError`

windows - "Android Create"在 Windows 7 中调用失败 - 缺少 JDK