使用 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|
+---+----+---+