在sparksql中设置textinputformat.record.delimiter

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

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

  1. =========================================
  2. 2001810086 rongq 2001 810!@!
  3. 2001810087 hauaa 2001 810!@!
  4. 2001820081 hello 2001 820!@!
  5. 2001820082 jaccy 2001 820!@!
  6. 2002810081 cindy 2002 810!@!
  7. =========================================

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

  1. create table ceshi(id int,name string, year string, major string)
  2. row format delimited
  3. fields terminated by '\t';
  4. load data local inpath '/data.txt' overwrite into table ceshi;
  5. 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 作为

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

如果你用 sparkContext 作为

  1. sc.textFile("the input file path")

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

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

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

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

它应该把dataframe作为

  1. +----------+-----+-----+-----+
  2. |id |name |year |major|
  3. +----------+-----+-----+-----+
  4. |2001810086|rongq| 2001|810 |
  5. |2001810087|hauaa| 2001|810 |
  6. |2001820081|hello| 2001|820 |
  7. |2001820082|jaccy| 2001|820 |
  8. |2002810081|cindy| 2002|810 |
  9. +----------+-----+-----+-----+

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

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

输出为

  1. +--------+
  2. |count(1)|
  3. +--------+
  4. |5 |
  5. +--------+
展开查看全部

相关问题