scala - 如何处理 Spark 数据​​帧中的数组<String>?

标签 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...|
+--------------------+--------------------+
我怎样才能得到这个数据框?

最佳答案

您可以使用 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/

相关文章:

scala - Kafka MirrorMaker 的消费者没有从主题中获取所有消息

json - 从Spark Scala中的序列文件中提取JSON记录

apache-spark - 使用 python 将数据 block 数据帧写入 S3

apache-spark - Spark 如何跟踪 randomSplit 中的分割?

scala - 在SBT中进行交叉构建时设置唯一的快照版本

scala - 每个单词的第一个字母大写|斯卡拉

scala - 如何对列表中的整数数量和 float 量求和 - Scala

hadoop - 如何使用 hadoop 自定义输入格式调整 Spark 应用程序

scala - Spark Streaming Kafka CreateDirectStream 无法解析

java - 运行简单的 twitter 情绪分析代码时获取不存在的 jar 和 java.lang.ClassNotFoundException