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)
如何获得此数据框?
您可以使用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)
希望这可以帮助!