gpt4 book ai didi

Scala-Spark(version1.5.2) 数据帧拆分错误

转载 作者:行者123 更新时间:2023-12-04 17:28:37 24 4
gpt4 key购买 nike

我有一个输入文件 foo.txt具有以下内容:

c1|c2|c3|c4|c5|c6|c7|c8|
00| |1.0|1.0|9|27.0|0||
01|2|3.0|4.0|1|10.0|1|1|

我想把它转换成 Dataframe执行一些 Sql查询:
var text = sc.textFile("foo.txt")
var header = text.first()
var rdd = text.filter(row => row != header)
case class Data(c1: String, c2: String, c3: String, c4: String, c5: String, c6: String, c7: String, c8: String)

到此为止一切正常,问题出在下一句:
var df = rdd.map(_.split("\\|")).map(p => Data(p(0), p(1), p(2), p(3), p(4), p(5), p(6), p(7))).toDF()

如果我尝试打印 dfdf.show ,我收到一条错误消息:
scala> df.show()
java.lang.ArrayIndexOutOfBoundsException: 7

我知道错误可能是由于拆分句子造成的。我也尝试过拆分 foo.txt使用以下语法:
var df = rdd.map(_.split("""|""")).map(p => Data(p(0), p(1), p(2), p(3), p(4), p(5), p(6), p(7))).toDF()

然后我得到这样的东西:
scala> df.show()
+------+---------+----------+-----------+-----+-----------+----------------+----------------+
| c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 |
+------+---------+----------+-----------+-----+-----------+----------------+----------------+
| 0| 0| || | || 1| .| 0|
| 0| 1| || 2| || 3| .| 0|
+------+---------+----------+-----------+-----+-----------+----------------+----------------+

因此,我的问题是如何正确地将此文件传递给 Dataframe。

编辑:错误位于第一行,原因是 ||没有中间空间的字段。这种类型的字段定义取决于示例工作正常或崩溃。

最佳答案

这是因为您的一行比其他行短:

scala> var df = rdd.map(_.split("\\|")).map(_.length).collect()
df: Array[Int] = Array(7, 8)

您可以手动填写行(但您需要手动处理每个案例):
val df = rdd.map(_.split("\\|")).map{row =>
row match {
case Array(a,b,c,d,e,f,g,h) => Data(a,b,c,d,e,f,g,h)
case Array(a,b,c,d,e,f,g) => Data(a,b,c,d,e,f,g," ")
}
}

scala> df.show()
+---+---+---+---+---+----+---+---+
| c1| c2| c3| c4| c5| c6| c7| c8|
+---+---+---+---+---+----+---+---+
| 00| |1.0|1.0| 9|27.0| 0| |
| 01| 2|3.0|4.0| 1|10.0| 1| 1|
+---+---+---+---+---+----+---+---+

编辑:

更通用的解决方案是这样的:
val df = rdd.map(_.split("\\|", -1)).map(_.slice(0,8)).map(p => Data(p(0), p(1), p(2), p(3), p(4), p(5), p(6), p(7))).toDF()

如果您假设您始终拥有正确数量的分隔符,则使用此语法截断最后一个值是安全的。

关于Scala-Spark(version1.5.2) 数据帧拆分错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43253936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com