在sparksql中设置textinputformat.record.delimiter

mitkmikd  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(573)

在spark2.0.1、hadoop2.6.0中,我有许多用“!@”分隔的文件\r'而不是通常的新行,例如:

=========================================

2001810086  rongq   2001    810!@!
2001810087  hauaa   2001    810!@!
2001820081  hello   2001    820!@!
2001820082  jaccy   2001    820!@!
2002810081  cindy   2002    810!@!

=========================================

我尝试根据spark中的textinputformat.record.delimiter设置提取数据 set textinputformat.record.delimiter='!@!\r'; 或者 set textinputformat.record.delimiter='!@!\n ';但仍然无法提取数据
在spark sql中,我执行以下操作:====================================

create table ceshi(id int,name string, year string, major string)
row format delimited
fields terminated by '\t';

load data local inpath '/data.txt' overwrite into table ceshi;
select count(*) from ceshi;

结果是5,但我试着 set textinputformat.record.delimiter='!@!\r' ; 那么 select count(*) from ceshi; 结果是1,定界符不起作用;
我还检查了hadoop2.6.0的源代码,textinputformat.java中的recordreader方法,我注意到默认的textinputformat.record.delimiter为null,然后linereader.java使用readdefaultline方法读取以cr、lf或crlf(cr='\r',lf='\n')之一终止的行。

brc7rcf0

brc7rcf01#

你应该使用 sparkContexthadoopConfiguration api来设置 textinputformat.record.delimiter 作为

sc.hadoopConfiguration.set("textinputformat.record.delimiter", "!@!\r")

如果你用 sparkContext 作为

sc.textFile("the input file path")

你应该没事的。
更新
我注意到一个带有分隔符的文本文件 \r 保存时更改为 \n 分隔符。
所以,下面的格式应该适用于你,因为它为我

sc.hadoopConfiguration.set("textinputformat.record.delimiter", "!@!\n")
val data = sc.textFile("the input file path")
val df = data.map(line => line.split("\t"))
.map(array => ceshi(array(0).toInt, array(1), array(2), array(3)))
.toDF

case clas 他打电话来了 ceshi 作为需要

case class ceshi(id: Int, name: String, year: String, major :String)

它应该把dataframe作为

+----------+-----+-----+-----+
|id        |name |year |major|
+----------+-----+-----+-----+
|2001810086|rongq| 2001|810  |
|2001810087|hauaa| 2001|810  |
|2001820081|hello| 2001|820  |
|2001820082|jaccy| 2001|820  |
|2002810081|cindy| 2002|810  |
+----------+-----+-----+-----+

现在你可以打电话了 count 作为

import org.apache.spark.sql.functions._
df.select(count("*")).show(false)

输出为

+--------+
|count(1)|
+--------+
|5       |
+--------+

相关问题