如何从DataFrame获取List[String]及从HDFS文本文件读取字符串列表?
嘿,这个问题我之前也踩过坑,其实解决起来很简单!咱们分两种场景来说明:
一、直接读取HDFS文本文件为List[String]
不用绕DataFrame的路子,直接用SparkContext的textFile方法就行——它返回的是RDD[String],每行数据直接对应一个字符串,一步到位:
import org.apache.spark.SparkContext val sc: SparkContext = ... // 你的SparkContext实例 val idList: List[String] = sc.textFile(filePath).collect().toList
二、从已有的DataFrame提取出List[String]
你之前用spark.read.text(filePath)得到的DataFrame,默认只有一个名为value的列,每行数据被包装成了Row对象。要转成字符串列表,只需要提取这个列的内容就行,有两种常用方式:
方法1:用map转换每个Row
直接遍历DataFrame的每一行,提取value列的字符串值:
val df = spark.read.text(filePath) val idList: List[String] = df.map(row => row.getString(0)).collect().toList
这里getString(0)是取Row的第一个字段(也就是默认的value列),因为文本文件的每行对应Row里的唯一字段。
方法2:转成Dataset[String]再提取
用select指定列后,通过as[String]把DataFrame转换成Dataset[String],这样collect出来直接就是字符串数组:
val df = spark.read.text(filePath) val idList: List[String] = df.select("value").as[String].collect().toList
⚠️ 重要提醒:如果你的文件特别大,绝对不要用collect()!这个方法会把集群上所有分布式存储的数据拉到Driver节点的内存里,很容易触发内存溢出(OOM)。这种情况下,应该用Spark的分布式操作处理数据,而不是强行拉到本地列表。
内容的提问来源于stack exchange,提问作者Noobie93
相关产品推荐
相关产品推荐

