Spark DataFrame如何将列表类型的domains列转换为Array[String]
问题原因
- 类型转换错误:
domains列本身存储的是数组格式数据,你使用.as[String]强制将数组转为字符串属于类型不匹配操作 - 打印逻辑问题:直接打印
collect()返回的数组对象时,Java/Scala默认输出数组的内存地址(即你看到的[Ljava.lang.String;@xxxx格式),而非数组实际内容
解决方法
根据你的需求分两种实现场景:
场景1:保留每行的独立数组,返回Array[Array[String]]格式
// 正确指定转换类型为Array[String] val result = DF.select("domains").as[Array[String]].collect() // 如需打印查看内容,遍历数组格式化输出即可 result.foreach(arr => println(arr.mkString("Array(\"", "\", \"", "\")")))
如果你的DF仅存在1行数据,可直接取首行得到单个数组:
val result = DF.select("domains").as[Array[String]].head()
场景2:合并所有行的数组成一个全局Array[String](和你给出的预期输出格式一致)
使用explode函数先打散数组元素再统一收集:
import org.apache.spark.sql.functions.explode val result = DF.select(explode($"domains").as("domain")) .as[String] .collect() // 打印验证输出 println(result.mkString("Array(\"", "\", \"", "\")"))
补充说明:如果你的
domains列实际存储的是JSON格式字符串(而非Spark原生ArrayType类型),需要先做类型转换再执行上述逻辑:import org.apache.spark.sql.functions.from_json import org.apache.spark.sql.types.{ArrayType, StringType} val parsedDF = DF.withColumn("domains", from_json($"domains", ArrayType(StringType)))
内容的提问来源于stack exchange,提问作者CyberPunk
相关产品推荐
相关产品推荐

