在sparksql中设置textinputformat.record.delimiter

时间:2017-07-22 02:24:32

标签: hadoop apache-spark apache-spark-sql

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

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

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

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

我尝试根据Setting textinputformat.record.delimiter in spark提取数据 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,分隔符donot工作得很好;

我还检查了hadoop2.6.0的源代码,TextInputFormat.java中RecordReader的方法,我注意到默认textinputformat.record.delimiter为null,然后LineReader.java使用readDefaultLine方法读取一行终止CR,LF或CRLF之一(CR ='\ r',LF ='\ n')。

1 个答案:

答案 0 :(得分:2)

您应该使用sparkContext的{​​{1}} api将hadoopConfiguration设置为

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)

现在您可以点击+----------+-----+-----+-----+ |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)