来自CSV的Hive表。引号中的行终止

时间:2018-02-13 09:41:47

标签: hadoop hive opencsv

我尝试从CSV文件创建表格,保存到HDFS中。问题是csv在quote内包含换行符。以CSV格式记录的示例:

<script src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script>
<script src="{{ path('fos_js_routing_js', { callback: 'fos.Router.setData' }) }}"></script>

我创建了hive表:

ID,PR_ID,SUMMARY
2063,1184,"This is problem field because consists line break

This is not new record but it is part of text of third column
"

然后我尝试计算行数(正确的结果应该是1)

CREATE TEMPORARY EXTERNAL TABLE  hive_database.hive_table
(   
    ID STRING,
    PR_ID STRING,
    SUMMARY STRING 
)
row format serde 'com.bizo.hive.serde.csv.CSVSerde'
with serdeproperties (
    "separatorChar" = ",",
    "quoteChar"     = "\"",
    "escapeChar"  = "\""
)     
stored as textfile
LOCATION '/path/to/hdfs/dir/csv'
tblproperties('skip.header.line.count'='1');

但结果是4是不正确的。你知道怎么解决吗?谢谢大家。

2 个答案:

答案 0 :(得分:1)

现在有无法来直接处理hive 中的多行csv 。 但是,有一些解决方法:

  1. 生成一个csv,\n\r\n替换为您自己的换行标记<\br>。您将能够在蜂巢中加载它。然后通过前者

  2. 替换后者来转换结果文本
  3. 使用spark,它有一个多行csv阅读器。这可以解决问题,而csv则无法以分布式方式阅读。

    val df = spark.read
    .option("wholeFile", true)
    .option("multiline",true)
    .option("header", true)
    .option("inferSchema", "true")
    .option("dateFormat", "yyyy-MM-dd")
    .option("timestampFormat", "yyyy-MM-dd HH:mm:ss")
    .csv("test.csv")
    .write.format("orc")
    .saveAsTable("myschma.myTable")
    
  4. 使用其他格式如拼花,avro,orc,序列文件,而不是csv。例如,您可以使用sqoop从jdbc数据库生成它们。或者你可以用java或python编写自己的程序。

答案 1 :(得分:1)

我找到了解决方案。您可以定义自己的InputFormatter。然后,DDL for HQL表将如下所示(首先需要添加自定义jar文件):

ADD JAR /path/to/your/jar/CSVCustomInputFormat.jar;
DROP TABLE hive_database.hive_table;
CREATE EXTERNAL TABLE  hive_database.hive_table
(   
    ID STRING,
    PR_ID STRING,
    SUMMARY STRING 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   "separatorChar" = ",",
   "quoteChar"     = "\"",
   "escapeChar"    = "\\"
) 
STORED AS 
INPUTFORMAT 'com.hql.custom.formatter.CSVCustomInputFormatt' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' 
LOCATION '/path/to/hdfs/dir/csv'
tblproperties('skip.header.line.count'='1');

然后,如何创建自定义输入格式化程序,例如:https://analyticsanvil.wordpress.com/2016/03/06/creating-a-custom-hive-input-format-and-record-reader-to-read-fixed-format-flat-files/