我正在阅读一个有很多空格的文件,需要过滤掉空间。之后我们需要将其转换为数据帧。下面的示例输入。
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)
有关如何执行此操作的任何建议吗?
答案 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))
productarity
问题?但是,我不知道如何将其纳入数据帧。
sc.textFile
返回RDD [String]。我尝试了案例类方法,但问题是我们 有800个字段模式,案例类不能超过22个。
是的,有一些限制,例如productarity
,但我们可以克服......
你可以像下面的例子那样做<版本2.11:
准备一个案例类extends Product
并覆盖方法。
喜欢......
productArity():Int:
返回属性的大小。在我们的例子中,它是33.所以,我们的实现看起来像这样:
productElement(n:Int):Any:
给定索引,返回属性。作为保护,我们还有一个默认情况,会引发IndexOutOfBoundsException
异常:
canEqual (that:Any):Boolean
:这是三个函数中的最后一个,当对类进行相等性检查时,它作为边界条件: