我有一个数据集,并且我想始终使用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,但它已经变成了硬编码。
发布于 2019-04-12 06:54:35
考虑到您将列转置为行的请求,您可能会遇到的一个问题是,您的值需要是string格式,而不是Int格式。首先,您需要将所有值转换为string。假设这一部分已经完成,这里就是你如何转移和使用struct来得到你想要的东西的方法
下面是它的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来获取所需格式的数据。
https://stackoverflow.com/questions/55628129
复制相似问题