我有一个 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...|
+--------------------+--------------------+
我怎样才能得到这个数据框?
最佳答案
您可以使用 concat_ws连接字符串数组并仅获取字符串的函数
data.withColumn("friends", concat_ws("",col("friends")))
concat_ws(java.lang.String sep, Column... exprs)
Concatenates multiple input string columns together into a single string column, using the given separator.
或者您可以使用简单的 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(Column e) Creates a new row for each element in the given array or map column.
如果您只想获取一个数据,那么正如@ramesh 建议的那样,您可以获得第一个元素
data.withColumn("friends", $"friends"(0))
希望这可以帮助!
关于scala - 如何处理 Spark 数据帧中的数组<String>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44906450/