使用 Scala 和 Spark 读取文本文件中的键值对,键作为列名,值作为行
Reading Key-Value pairs in a text file, key as column names and values as rows using Scala and Spark
我有一个格式如下的文本文件。
<Begin
Id=1
Name=John
Age=32
<End
<Begin
Id=2
Name=Jack
Age=20
<End
我想做的是使用Scala在spark中创建一个数据框,将上面的键作为列名
以及它们的值作为数据框中的行。请注意,我有几个开始-结束部分以及几个键值对。
我已经将键和值分开列并尝试将键行值转换为列名但失败了。这就是我所做的:
val test = textRDD.filter(rows => !rows.contains("<Begin")).filter(rows => !rows.contains("<End")).map {
line =>
val har = line.split("=")
Table1(har(0), har(1))
}
val testDF = test.toDF()
testDF.show()
这是我的案例class
case class Table1(columNames:String, valuesCol:String)
输出-:
+------------+-----------+
| columNames | valuesCol |
+------------+-----------+
| Id | 1 |
| Name | John |
| Age | 32 |
| Id | 2 |
| Name | Jack |
| Age | 20 |
+------------+-----------+
要求输出-:
+----+------+-----+
| Id | Name | Age |
+----+------+-----+
| 1 | John | 32 |
| 2 | Jack | 20 |
+----+------+-----+
I'm using Spark 2.4.0
Thanks.
试试这个。为了使用数据透视表,您应该使用单独的键将这些值分组为一行。所以,我添加了它并使用 pivot 到数据框。
val w = Window.rowsBetween(Window.unboundedPreceding, Window.currentRow)
df.withColumn("group", when('columNames === lit("Id"), 1))
.withColumn("group", sum('group).over(w))
.groupBy("group").pivot("columNames", Seq("Id", "Name", "Age")).agg(first("valuesCol"))
.drop("group")
.show()
+---+----+---+
| Id|Name|Age|
+---+----+---+
| 1|John| 32|
| 2|Jack| 20|
+---+----+---+
我有一个格式如下的文本文件。
<Begin
Id=1
Name=John
Age=32
<End
<Begin
Id=2
Name=Jack
Age=20
<End
我想做的是使用Scala在spark中创建一个数据框,将上面的键作为列名 以及它们的值作为数据框中的行。请注意,我有几个开始-结束部分以及几个键值对。
我已经将键和值分开列并尝试将键行值转换为列名但失败了。这就是我所做的:
val test = textRDD.filter(rows => !rows.contains("<Begin")).filter(rows => !rows.contains("<End")).map {
line =>
val har = line.split("=")
Table1(har(0), har(1))
}
val testDF = test.toDF()
testDF.show()
这是我的案例class
case class Table1(columNames:String, valuesCol:String)
输出-:
+------------+-----------+
| columNames | valuesCol |
+------------+-----------+
| Id | 1 |
| Name | John |
| Age | 32 |
| Id | 2 |
| Name | Jack |
| Age | 20 |
+------------+-----------+
要求输出-:
+----+------+-----+
| Id | Name | Age |
+----+------+-----+
| 1 | John | 32 |
| 2 | Jack | 20 |
+----+------+-----+
I'm using Spark 2.4.0
Thanks.
试试这个。为了使用数据透视表,您应该使用单独的键将这些值分组为一行。所以,我添加了它并使用 pivot 到数据框。
val w = Window.rowsBetween(Window.unboundedPreceding, Window.currentRow)
df.withColumn("group", when('columNames === lit("Id"), 1))
.withColumn("group", sum('group).over(w))
.groupBy("group").pivot("columNames", Seq("Id", "Name", "Age")).agg(first("valuesCol"))
.drop("group")
.show()
+---+----+---+
| Id|Name|Age|
+---+----+---+
| 1|John| 32|
| 2|Jack| 20|
+---+----+---+