难以从文本文件创建spark.sql.Row

时间:2017-01-17 15:23:12

标签: scala apache-spark

我试过了:

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]

如何修复地图?

3 个答案:

答案 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可能会帮助您在更高级别上工作。