我希望镶木地板文件数据为以下字符串格式有人可以帮助我吗?

问题描述

我正在尝试获取以下格式的数据。有人可以帮我获得一个用于 spark 和 Scala.我是新来的。有人可以帮忙吗? 我期待的输出是字符串输出

Java|XX||Scala|XA

如果数组中有延续值,则应继续 请帮帮我,很重要的任务

root
 |-- name: string (nullable = true)
 |-- booksIntersted: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- author: string (nullable = true)
 |    |    


+----------+-----------------------------------+
|name      |booksIntersted                     |
+----------+-----------------------------------+
|James     |[[Java,XX],[Scala,XA]]|
|Michael   |[[Java,XY],XB]]|
|Robert    |[[Java,XZ],XC]]|
|Washington|null                               |
+----------+-----------------------------------+
```

解决方法

检查下面的代码。

val finalDF = df
.withColumn(
    "booksIntersted",when(
        size($"booksIntersted") > 0,expr("concat_ws('||',transform(booksIntersted,x -> concat(x.name,'|',x.author)))")
    )
)

finalDF.printSchema

root
 |-- name: string (nullable = true)
 |-- booksIntersted: string (nullable = true)

finalDF.show(false)

+----------+-----------------+
|name      |booksIntersted   |
+----------+-----------------+
|James     |Java|XX||Scala|XA|
|Michael   |Java|XY||Scala|XB|
|Robert    |Java|XZ||Scala|XC|
|Washington|null             |
+----------+-----------------+

csv格式写入数据

finalDF
.repartition(1)
.write
.format("csv")
.option("header","true")
.save("/tmp/csv/data")
cd /tmp/csv/data
> cat part-00000-c8527721-5b25-4689-bfe4-028ac2873def-c000.csv
name,booksIntersted
James,Java|XX||Scala|XA
Michael,Java|XY||Scala|XB
Robert,Java|XZ||Scala|XC
Washington,""

使用 udf

scala> val combine = udf((row: Seq[Row]) => {
    row
    .map(r => r.getAs[String]("name") + "|" + r.getAs[String]("author"))
    .reduce(_+ "||" + _)
})
scala> df
.withColumn(
    "booksInterstedNew",combine($"booksIntersted")
    )
)
.show(false)
+----------+-------------------------+-----------------+
|name      |booksIntersted           |booksInterstedNew|
+----------+-------------------------+-----------------+
|James     |[[Java,XX],[Scala,XA]]|Java|XX||Scala|XA|
|Michael   |[[Java,XY],XB]]|Java|XY||Scala|XB|
|Robert    |[[Java,XZ],XC]]|Java|XZ||Scala|XC|
|Washington|[]                       |null             |
+----------+-------------------------+-----------------+