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

标签 hadoop hive opencsv

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

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
"

我创建了配置单元表:

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');

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

Select count(*) from hive_database.hive_table;

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

最佳答案

目前没有办法直接在配置单元中处理多行 csv。 但是,有一些解决方法:

  1. 使用 \n 生成一个 csv或 \r\n替换为您自己的换行符,例如 <\br> .您将能够在配置单元中加载它。然后通过将后者替换为前者来转换生成的文本

  2. 使用 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")
    
  3. 使用其他格式,例如 parquet、avro、orc、序列文件,而不是 csv。例如,您可以使用 sqoop 从 jdbc 数据库生成它们。或者你可以用 java 或 python 编写你自己的程序。

关于hadoop - 来自 CSV 的 Hive 表。引号中的行终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48763661/

相关文章:

hadoop - 如何使用 ORC 存储 Hive 表以进行复杂查询?

java - OpenCSV所有数据存储在单行版本(5.1)和数据丢失

hadoop - Hive外部表检索查询(Hive的新增功能)

Hadoop (1.0.1) 使用 libssl 编译错误

python - 如何在Hadoop流中使用opt解析器作为映射器指定python脚本

apache-spark - 在HIVE中执行查询,但看不到结果

regex - 在 hadoop 中的 Pig 中使用正则表达式

date - 如何在Hive中将ISO日期转换为UTC日期

java - 如何在@CsvBindByName 中获取确切名称?

java - 在 Java 中解析 CSV 文件时出现问题