>我有一个数据集,我想始终使用 Spark 和 Java 将列(动态列数(转置为两行。
示例输入:
+-------+-------+---------+
|titanic|IronMan|Juglebook|
+-------+-------+---------+
| 101| test1| 10|
| 102| test2| 20|
| 103| test3| 30|
+-------+-------+---------+
示例输出:
| Colname|colvalue
+---------+----+----+---------+
| titanic| 101,102,103 |
| IronMan | test1,test2,test3|
|Juglebook | 10,20,30 |
+-------+-------+-------------+
我尝试使用Spark sql,但它正在变得硬编码。
考虑到您将列转置为行的请求,您可能会面临的一个问题是您的值需要在字符串中而不是在 Int 中。 首先,您需要将所有值转换为字符串。 假设这部分已经完成,这就是您可以如何使用 structa 来达到您想要的东西
下面是它的 Scala 实现
Import org.apache.spark.sql.funtions._
def transpose(transDF:DataFrame) :DataFrame ={
cols1= transDF.dtypes.unzip
cols2= cols1._1
val KVS = explode(
array(cols2.map(c =>struct(lit(c).alias("column_name"), col(c).alias("column_Value"))
):_*))
transDF.Select(kvs.alias("_kvs"))
}
您可以从 main 调用该函数,这将返回转置的列。然后,您可以使用groupby和Agg来获取所需格式的数据。