如何在spark数据帧中处理数组<string>?

时间:2017-07-04 12:48:17

标签: 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>]

如何将其转换为[user_id:String,friend:String],例如:

+--------------------+--------------------+
|             user_id|             friend|
+--------------------+--------------------+
|18kPq7GPye-YQ3LyK...| rpOyqD_893cqmDAt...|
|18kPq7GPye-YQ3LyK...| 18kPq7GPye-YQ3Ly...|
|4U9kSBLuBDU391x6b...| 18kPq7GPye-YQ3Ly...|
|fHtTaujcyKvXglE33...| 18kPq7GPye-YQ3Ly...|
+--------------------+--------------------+

如何获取此数据框?

1 个答案:

答案 0 :(得分:5)

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

data.withColumn("friends", concat_ws("",col("friends")))
  

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"))

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

data.withColumn("friends", explode($"friends"))
  

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

如果您只想获取一个数据,那么@ramesh建议您可以获得第一个元素

data.withColumn("friends", $"friends"(0))

希望这有帮助!