如何在 hive 表中加载多行列数据?具有换行符的列

Posted

技术标签:

【中文标题】如何在 hive 表中加载多行列数据?具有换行符的列【英文标题】:How to load multi-line column data in hive table? Columns having new line characters 【发布时间】:2016-10-03 12:59:05 【问题描述】:

我在 Excel 文件中有一个列(不是最后一列),其中包含跨越几行的数据。

有些单元格是空白的,有些单元格是单行条目。

当另存为 .CSV 文件或从 excel 中以制表符分隔的 .txt 时,所有多行数据和少量单行条目都在双引号中生成,没有一个空白字段在引号中。一些单行条目不在引号内。

是否可以将具有相同结构的数据存储在配置单元表中?如果是,如何做到这一点? 我知道我需要在双引号内转义所有 LF,并仅将最后一个 LF 作为实际 EOL 处理。但是遇到 '\n' 的那一刻,Hive 会将数据带到新行。

excel中的数据格式如下:

|------+------+--------+------------------+-------+------|
|row1: | col1 | col2   | col3(multi-line) | col4  | col5 |
|------+------+--------+------------------+-------+------|
|      |      |        | line 1 of 3      |       |      |
|row2: | abc  | defsa  | line 2 of 3      | bcde  | hft  |
|      |      |        | line 3 of 3      |       |      |
|------+------+--------+------------------+-------+------|
|row3: | abc2 | defsa2 | (blank)          | bcde2 | hft2 |
|------+------+--------+------------------+-------+------|
|row4: | abc3 | defsa3 | single-line1     | bcde3 | hft3 |
|------+------+--------+------------------+-------+------|
|row5: | abc4 | defsa4 | single-line2     | bcde4 | hft4 |
|------+------+--------+------------------+-------+------|

当另存为 CVS 时,它会输出到以下内容:

row1--col1,col2,col3(多行),col4,col5 第 2 行--abc,defsa,第 1 行,共 3 行",,,,,, 第 3 行——第 2 行,共 3 行,,,,,, 第 4 行——第 3 行,共 3 行,,,,,, 第 5 行--",bcde,hft 第6行--abc2,defsa2,,bcde2,hft2 第7行--abc3,defsa3,单行1,bcde3,hft3 row8--abc4,defsa4,single-line2",,,,,, 第9行--",bcde4,hft4

5 行 excel 到 9 行 csv。

如果可能的话,在不更改结构和维护多行列的情况下,将此 .csv 文件中的输入存储到配置单元表中。

【问题讨论】:

【参考方案1】:

From this link,提供的 SerDe 无法处理嵌入的新行。我的猜测是,如果您想要嵌入新行,则必须创建自定义 SerDe。无需深入研究,this 是一个很好的资源,可能有助于创建自定义 SerDe。

您是否尝试过在将数据加载到 Hive 之前使用 Pig 处理数据,例如您可以在将 \n 字符移至 Hive 之前将其替换为其他字符。但是您可能会遇到无法将其准确加载到 Pig 中的相同问题,因为它可能使用相同的 SerDe。

最终,自定义 SerDe 将解决您的问题,但可能还有另一种更简单的方法我没有看到。

【讨论】:

以上是关于如何在 hive 表中加载多行列数据?具有换行符的列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pyspark 中加入带有熊猫数据框的配置单元表?

在 hive 的一列中加载具有“(双引号)的管道分隔 CSV 数据

无法以正确的形式在 Hive 表中加载数据

在 Hive 中将单行列拆分为多列

Sqoop 导入具有 avro 格式的换行符的数据,然后使用 hive 查询

Hive中行列转换