在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')。
答案 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)