将RDD [String]转换为RDD [Row]到Dataframe Spark Scala

时间:2017-01-27 16:02:34

标签: scala hadoop apache-spark dataframe spark-dataframe

我正在阅读一个有很多空格的文件,需要过滤掉空间。之后我们需要将其转换为数据帧。下面的示例输入。

2017123 ¦     ¦10¦running¦00000¦111¦-EXAMPLE

我对此的解决方案是以下函数,该函数解析所有空格并修剪文件。

def truncateRDD(fileName : String): RDD[String] = {
    val example = sc.textFile(fileName)
    example.map(lines => lines.replaceAll("""[\t\p{Zs}]+""", ""))
}

但是,我不知道如何将其纳入数据帧。 sc.textFile会返回RDD[String]。我尝试了案例类方法,但问题是我们有800字段模式,案例类不能超过22。

我在考虑以某种方式将RDD [String]转换为RDD [Row],因此我可以使用createDataFrame函数。

val DF = spark.createDataFrame(rowRDD, schema)

有关如何执行此操作的任何建议吗?

2 个答案:

答案 0 :(得分:7)

首先将字符串拆分/解析为字段。

rdd.map( line => parse(line))其中parse是一些解析函数。它可以像拆分一样简单,但你可能想要更强大的东西。这将为您提供RDD[Array[String]]或类似内容。

然后,您可以使用RDD[Row]

转换为rdd.map(a => Row.fromSeq(a))

从那里你可以转换为DataFrame wising sqlContext.createDataFrame(rdd, schema),其中rdd是你的RDD[Row],架构是你的架构StructType。

答案 1 :(得分:1)

以您的方式简单:

val RowOfRDD = truncateRDD("yourfilename").map(r => Row.fromSeq(r))

如果您使用的是scala 2.10,如何解决productarity问题?

  

但是,我不知道如何将其纳入数据帧。 sc.textFile   返回RDD [String]。我尝试了案例类方法,但问题是我们   有800个字段模式,案例类不能超过22个。

是的,有一些限制,例如productarity,但我们可以克服...... 你可以像下面的例子那样做<版本2.11:

准备一个案例类extends Product并覆盖方法。

喜欢......

  • productArity():Int:返回属性的大小。在我们的例子中,它是33.所以,我们的实现看起来像这样:

  • productElement(n:Int):Any:给定索引,返回属性。作为保护,我们还有一个默认情况,会引发IndexOutOfBoundsException异常:

  • canEqual (that:Any):Boolean:这是三个函数中的最后一个,当对类进行相等性检查时,它作为边界条件: