我试过了:
val textLines = spark.sparkContext.textFile("file.txt")
val rowRDD = Row.fromSeq(textLines.map(_.split(",")))
但是,我收到错误
type mismatch;
found : org.apache.spark.rdd.RDD[Array[String]]
required: Seq[Any]
如何修复地图?
答案 0 :(得分:1)
Map是高阶函数函数。返回值始终包含在您应用映射函数的类型
示例: - 列表("答案","问题"," StackOverFlow")。map(x => x.length)
然后这个map函数应用于String值,但返回Int Value,但它包含在List上,即List[String] => List[Int]
此处您的地图已应用于textLines
,类型为RDD [String]
然后,您已应用返回RDD[String]
的{{1}}地图
不是RDD[Array[String]]
你只需要使用像(;
)这样的collect()方法Array[String]
我正在使用val textLines = spark.sparkContext.textFile("file.txt")
val wordsArray = textLines.flatMap(_.split(",")).collect
val rowRDD = Row.fromSeq(wordsArray)
方法返回collect()
,我使用Array[String]
代替flatMap
,因为map
展平了价值
否则在collect()上你会得到flatMap
如果适合您的情况,您可以使用地图。
希望这可以解决您的问题
答案 1 :(得分:1)
如果您要执行的操作是将 CSV 加载到 DataFrame 中,则可以采用更简单的方法:
val dataframe: DataFrame = spark.read.csv("file.text")
或者,如果您真的有兴趣将RDD[String]
转换为RDD[Row]
- 请按以下步骤操作:
val rows: RDD[Row] = textLines.map(_.split(",")).map {
a: Array[_] => Row(a: _*)
}
但请注意,这可能会创建“不均匀”的行(如果您的数据不是正确的CSV,则不同的行可能具有不同的列数,这会使此RDD非常不可用)。
答案 2 :(得分:0)
我也问你为什么试图用这样的文本文件创建一个Row?由于您正在解析CSV文件,因此spark-csv可能会帮助您在更高级别上工作。