Scala-Spark(版本1.5.2)Dataframes拆分错误
发布时间:2020-12-16 18:09:29 所属栏目:安全 来源:网络整理
导读:我有一个输入文件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(r
我有一个输入文件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() 如果我尝试使用df.show打印df,我会收到一条错误消息: scala> df.show() java.lang.ArrayIndexOutOfBoundsException: 7 我知道错误可能是因为分句.我还尝试使用以下语法拆分foo.txt: var df = rdd.map(_.split("""|""")).map(p => Data(p(0),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,h) case Array(a,g) => Data(a," ") } } 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(7))).toDF() 如果您假设始终具有正确数量的分隔符,则可以安全地使用此语法截断最后一个值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读