我正在使用Cloudera的Hive版本并尝试在包含第一列中的列名的csv文件上创建外部表.这是我用来做的代码.
CREATE EXTERNAL TABLE Test (
RecordId int,
FirstName string,
LastName string
)
ROW FORMAT serde 'com.bizo.hive.serde.csv.CSVSerde'
WITH SerDeProperties (
"separatorChar" = ","
)
STORED AS TEXTFILE
LOCATION '/user/File.csv'
Run Code Online (Sandbox Code Playgroud)
样本数据
RecordId,FirstName,LastName
1,"John","Doe"
2,"Jane","Doe"
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我跳过第一行或者我需要添加一个中间步骤吗?
Dan*_*man 76
数据中的标题行是Hive中的永久性头痛.如果没有修改Hive源,我相信没有中间步骤你就无法逃脱.(编辑:这不再是真的,请参阅下面的更新)
不幸的是,这回答了你的问题.我将为完整性的中间步骤提出一些想法.
如果您愿意在每个触及表的查询中过滤掉标题行,则可以在数据加载中没有额外步骤的情况下离开.不幸的是,这增加了其他地方的额外设置.当标题行违反您的模式时,您将不得不变得聪明/凌乱.如果你采用这种方法,你可以考虑编写一个自定义的SerDe,使这行更容易过滤.不幸的是,SerDe不能完全删除该行(或者可能形成一个可能的解决方案),他们必须返回类似的东西null.我从来没有在实践中看到这种方法来处理标题行,因为它使阅读变得痛苦,阅读往往比写作更常见.如果您正在处理一个表,或者标题行只是许多格式错误的行中的一行,那么它可能有一个位置.
您可以使用删除数据加载中第一行的变体进行一次此过滤.一个WHERE在条款INSERT声明会做到这一点.您可以使用实用程序sed来摆脱它.我已经看到了两种方法.在你采取哪种方法之间存在权衡,也不是处理标题行的唯一方法.不幸的是,这两种方法都需要时间并且需要临时复制数据.如果您绝对需要另一个应用程序的标题行,则复制将是永久性的.
更新:
从Hive v0.13.0,您可以使用skip.header.line.count.您也可以在创建表时指定相同的内容.例如:
create external table testtable (name string, message string)
row format delimited
fields terminated by '\t'
lines terminated by '\n'
location '/testtable'
tblproperties ("skip.header.line.count"="1");
Run Code Online (Sandbox Code Playgroud)
Nir*_*mal 15
虽然您有Daniel的答案,但可以使用OpenCSVSerde以下方法进行一些自定义:
CREATE EXTERNAL TABLE `mydb`.`mytable`(
`product_name` string,
`brand_id` string,
`brand` string,
`color` string,
`description` string,
`sale_price` string)
PARTITIONED BY (
`seller_id` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = '\t',
'quoteChar' = '"',
'escapeChar' = '\\')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://namenode.com:port/data/mydb/mytable'
TBLPROPERTIES (
'serialization.null.format' = '',
'skip.header.line.count' = '1')
Run Code Online (Sandbox Code Playgroud)
有了这个,您可以完全控制分隔符,引号字符,转义字符,空值处理和标题处理.
小智 9
只需在查询中追加属性下方,并且第一个标题或行int将不会加载记录,也不会跳过它.
试试这个
tblproperties ("skip.header.line.count"="1");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
92952 次 |
| 最近记录: |