java - 如何在 Java Spark 中将列转置为行

标签 java apache-spark apache-spark-sql

我想将表格中的一些列转置为行。我正在使用 Java 和 Spark 2.1.2。这是我的表格:

+-----+-----+-----+-----+-----+  
|  A  |col_1|col_2|col_3|col_4|   
+-----+-----------------+------+    
|  1  |  0.0|  0.6|  0.8| 0.9|   
|  2  |  0.6|  0.7|  0.7| 1.2|   
|  3  |  0.5|  0.9|  1.8| 9.1|  
|  ...|  ...|  ...|  ...| ...| 

我想要这样的东西:

+-----+--------+-----------+    
|  A  | col_id | col_value |  
+-----+--------+-----------+  
|  1  |   col_1|        0.0|  
|  1  |   col_2|        0.6|     
|  1  |   col_3|        0.8|  
| ... |    ... |        ...|     
|  2  |   col_1|        0.6|  
|  2  |   col_2|        0.7|   
|  ...|     ...|        ...|    
|  3  |   col_1|        0.5|  
|  3  |   col_2|        0.9|  
|  ...|     ...|        ...| and so on 

有人知道我该怎么做吗?我知道 Python 存在解决方案,但我正在尝试使用 Java 来实现。

我尝试过这个方法

 df.selectExpr("stack(4, 'col_1', col_1, 'col_2', col_2', col_3', col_3,'col_4', col_4)as (Key,Value)");

但它不起作用。

编辑:

我能够使用上述方法得到结果。事实证明我使用的是 SparkContext 而不是 SQLContext,它运行得很好。

最佳答案

使用 Spark-scala 的解决方案:

def transpose(spark: SparkSession, df: DataFrame, transposeUsing: Seq[String]): DataFrame = {
import spark.implicits._
val (cols, types) = df.dtypes.filter{ case (c, _) => !transposeUsing.contains(c)}.unzip

val kvdf = explode(array(cols.map(c => struct(lit(c).alias("column_name"),col(c).alias("column_value"))): _*))

val constantCols = transposeUsing.map(col(_))

df.select(constantCols :+ kvdf.alias("_kvdf"): _*)
  .select(constantCols ++ Seq($"_kvdf.column_name", $"_kvdf.column_value"): _*)
}
 //call the function
transpose(df, Seq("A")).show()

关于java - 如何在 Java Spark 中将列转置为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60411037/

相关文章:

java - 使用客户端登录授权 Google 云端硬盘服务 java?

java - 为什么我在查询实体时没有从 MongoOperation 获得任何结果?

Scala 通过表达式向数据框添加新列

apache-spark - Pyspark 命令无法识别(Ubuntu)

scala - 如何在 Spark 中设置 Parquet 文件编码

apache-spark - 如何删除超过 X 天/年的 Databricks 数据?

Java 阻塞队列

java - NavigationDrawer 内的 RecyclerView 不滚动

java - 如何避免应用程序日志中的 Spark 和 Hive 日志

scala - 如何使用 withColumn Spark Dataframe scala with while