我有一个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...|
+--------------------+--------------------+
如何获取此数据框?
答案 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))
希望这有帮助!