使用scala在Spark中转置没有聚合的DataFrame

Mar*_*i K 9 transpose scala dataframe apache-spark

我在网上查看了许多不同的解决方案,但没有找到我想要解决的问题。请帮我解决这个问题。

我在 Scala 中使用 Apache Spark 2.1.0。以下是我的数据框:


+-----------+-------+
|COLUMN_NAME| VALUE |
+-----------+-------+
|col1       | val1  |
|col2       | val2  |
|col3       | val3  |
|col4       | val4  |
|col5       | val5  |
+-----------+-------+
Run Code Online (Sandbox Code Playgroud)

我希望将其转置为,如下所示:


+-----+-------+-----+------+-----+
|col1 | col2  |col3 | col4 |col5 |
+-----+-------+-----+------+-----+
|val1 | val2  |val3 | val4 |val5 |
+-----+-------+-----+------+-----+
Run Code Online (Sandbox Code Playgroud)

Rap*_*oth 10

您可以使用 来做到这一点pivot,但您仍然需要聚合,但是如果您有多个valueaCOLUMN_NAME呢?

val df = Seq(
  ("col1", "val1"),
  ("col2", "val2"),
  ("col3", "val3"),
  ("col4", "val4"),
  ("col5", "val5")
).toDF("COLUMN_NAME", "VALUE")

df
  .groupBy()
  .pivot("COLUMN_NAME").agg(first("VALUE"))
  .show()

+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
|val1|val2|val3|val4|val5|
+----+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您的数据框真的像您的示例中那样小,则可以将其收集为Map

val map = df.as[(String,String)].collect().toMap
Run Code Online (Sandbox Code Playgroud)

然后应用这个答案


Ram*_*jan 7

如果您的数据框像问题一样小,那么您可以收集 COLUMN_NAME 以形成架构收集 VALUE 以形成行,然后创建一个新的数据框作为

import org.apache.spark.sql.functions._
import org.apache.spark.sql.Row
//creating schema from existing dataframe
val schema = StructType(df.select(collect_list("COLUMN_NAME")).first().getAs[Seq[String]](0).map(x => StructField(x, StringType)))
//creating RDD[Row] 
val values = sc.parallelize(Seq(Row.fromSeq(df.select(collect_list("VALUE")).first().getAs[Seq[String]](0))))
//new dataframe creation
sqlContext.createDataFrame(values, schema).show(false)
Run Code Online (Sandbox Code Playgroud)

这应该给你

+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
|val1|val2|val3|val4|val5|
+----+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)

  • 我们如何在 pyspark 中做到这一点? (2认同)