Scala 从文本文件创建spark.sql.Row时遇到困难

Scala 从文本文件创建spark.sql.Row时遇到困难,scala,apache-spark,Scala,Apache Spark,我试过: val textLines = spark.sparkContext.textFile("file.txt") val rowRDD = Row.fromSeq(textLines.map(_.split(","))) 然而,我得到了错误 类型不匹配; 找到:org.apache.spark.rdd.rdd[Array[String]] 必填项:Seq[任何] 如何修复映射?映射是一个高阶函数。返回值始终包装为应用映射函数的类型 示例:-列表(“回答”、“问题”、“堆栈溢出”).ma

我试过:

val textLines = spark.sparkContext.textFile("file.txt")
val rowRDD = Row.fromSeq(textLines.map(_.split(",")))
然而,我得到了错误
类型不匹配;
找到:org.apache.spark.rdd.rdd[Array[String]]
必填项:Seq[任何]


如何修复映射?

映射是一个高阶函数。返回值始终包装为应用映射函数的类型

示例:-列表(“回答”、“问题”、“堆栈溢出”).map(x=> x、 长度)

然后,此映射函数应用于字符串值,但返回Int值,但它被包装在列表中,即
List[String]=>List[Int]

在这里,您的地图应用于RDD[String]类型的
文本行
然后您已经在返回的
RDD[Array[String]]
上应用了map 非
数组[字符串]

您只需要使用collect()方法,如

val textLines = spark.sparkContext.textFile("file.txt")
val wordsArray = textLines.flatMap(_.split(",")).collect
val rowRDD = Row.fromSeq(wordsArray)
我使用
collect()
方法返回
Array[String]
并且我使用
flatMap
而不是
map
,因为
flatMap
会展平值 否则,在collect()上,您将获得
Array[Array[String]]
如果map适合您的场景,您可以使用它


希望这能解决您的问题

Map是一个高阶函数。返回值始终包装为应用映射函数的类型

示例:-列表(“回答”、“问题”、“堆栈溢出”).map(x=> x、 长度)

然后,此映射函数应用于字符串值,但返回Int值,但它被包装在列表中,即
List[String]=>List[Int]

在这里,您的地图应用于RDD[String]类型的
文本行
然后您已经在返回的
RDD[Array[String]]
上应用了map 非
数组[字符串]

您只需要使用collect()方法,如

val textLines = spark.sparkContext.textFile("file.txt")
val wordsArray = textLines.flatMap(_.split(",")).collect
val rowRDD = Row.fromSeq(wordsArray)
我使用
collect()
方法返回
Array[String]
并且我使用
flatMap
而不是
map
,因为
flatMap
会展平值 否则,在collect()上,您将获得
Array[Array[String]]
如果map适合您的场景,您可以使用它


希望这能解决您的问题

我还想问您为什么要用这样的文本文件创建一行?由于您正在解析CSV文件,可能有助于您在更高的级别上工作。

我还想问您为什么要尝试用这样的文本文件创建一行?由于您正在解析CSV文件,可能会帮助您在更高的级别上工作。

如果您试图将CSV加载到数据帧中,有一种更简单的方法:

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非常不可用)。

如果您试图将CSV加载到数据框中,有一种更简单的方法:

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非常不可用)