如何处理Spark DataFrame中的array <String>?

Pi *_* Pi 5 scala apache-spark

我有一个json数据集,其格式为:

val data = spark.read.json("user.json").select("user_id","friends").show()
+--------------------+--------------------+
|             user_id|             friends|
+--------------------+--------------------+
|18kPq7GPye-YQ3LyK...|[rpOyqD_893cqmDAt...|
|rpOyqD_893cqmDAtJ...|[18kPq7GPye-YQ3Ly...|
|4U9kSBLuBDU391x6b...|[18kPq7GPye-YQ3Ly...|
|fHtTaujcyKvXglE33...|[18kPq7GPye-YQ3Ly...|
+--------------------+--------------------+
data: org.apache.spark.sql.DataFrame = [user_id: string, friends: array<string>]
Run Code Online (Sandbox Code Playgroud)

如何将其转换为[user_id:字符串,朋友:字符串],例如:

+--------------------+--------------------+
|             user_id|             friend|
+--------------------+--------------------+
|18kPq7GPye-YQ3LyK...| rpOyqD_893cqmDAt...|
|18kPq7GPye-YQ3LyK...| 18kPq7GPye-YQ3Ly...|
|4U9kSBLuBDU391x6b...| 18kPq7GPye-YQ3Ly...|
|fHtTaujcyKvXglE33...| 18kPq7GPye-YQ3Ly...|
+--------------------+--------------------+
Run Code Online (Sandbox Code Playgroud)

如何获得此数据框?

Sha*_*ala 5

您可以使用concat_ws函数来连接字符串数组并仅获取一个字符串

data.withColumn("friends", concat_ws("",col("friends")))
Run Code Online (Sandbox Code Playgroud)

concat_ws(java.lang.String sep, Column... exprs) 使用给定的分隔符将多个输入字符串列连接到一个字符串列中。

或者您可以使用简单的udf将数组转换为字符串,如下所示

 import org.apache.spark.sql.functions._

 val value = udf((arr: Seq[String]) => arr.mkString(" "))

 val newDf = data.withColumn("hobbies", value($"friends"))
Run Code Online (Sandbox Code Playgroud)

如果您尝试获取用户的数组值,则可以使用explode方法作为

data.withColumn("friends", explode($"friends"))
Run Code Online (Sandbox Code Playgroud)

explode(Column e)为给定数组或map列中的每个元素创建一个新行。

如果您尝试仅获取一个数据,则按照@ramesh的建议,您可以获取第一个元素为

data.withColumn("friends", $"friends"(0))
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!