【问题标题】:handling newline character in hive处理蜂巢中的换行符
【发布时间】:2014-10-13 12:03:03
【问题描述】:

我在 hive 中创建了一个表

Create table(id int, Description String)  

我的数据如下所示:

1|这将返回损坏的数据,因为第一个字符串中有一个“,”。 一些文字 更改数据 2|读取数据有问题 一些文本

数据加载到hive后,由于默认的行终止符是\n,描述列不能被hive读取,所以显示为NULL值。任何人都可以建议在加载到配置单元之前如何处理换行符。

【问题讨论】:

  • 有没有人遇到过这种情况,字段中的特定值是多行的?

标签: hadoop hive


【解决方案1】:

我知道这个问题很老,但您有几个选择。你不能用FIELDS TERMINATED BY 控制它,因为它只控制终止字段的内容,而不是记录。 Hive 中的记录被硬编码为由换行符终止(即使有 LINES TERMINATED BY 子句,它也没有实现)。

  1. 编写一个自定义的InputFormat,它使用一个RecordReader 理解非换行符分隔的记录。看代码 LineReader/LineRecordReaderTextInputFormat
  2. 使用格式 除了文本/ASCII,如 Parquet。我会推荐这个 无论如何,因为文本可能是您可以存储数据的最差格式 无论如何。

【讨论】:

    【解决方案2】:

    尝试在 hive-site.xml 中添加以下属性,或者您可以尝试临时 hive 会话级别。

    hive.query.result.fileformat=SequenceFile

    【讨论】:

      【解决方案3】:

      默认情况下,hive 将 NEWLINE ('\N') 作为分隔符。 您可以使用以下方法更改分隔符:

          ROW FORMAT DELIMITED FIELDS TERMINATED BY ",";
      

      【讨论】:

      • 我知道这个选项。场分离不是问题。在我的例子中,第二个字段(字符串)是多行字段(特定记录的字段值分布在多行上)
      • 是不是这样,当你选择 * 表时你得到 1 个文本或 1 个 NULL
      • 第一行加载正确,但是当它遇到新行(在第二个字段值中)时,它会放置空值
      • 你一样!!那么您是否尝试将分隔符更改为非换行符?
      猜你喜欢
      • 2018-08-11
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 2015-05-20
      • 2016-12-19
      相关资源
      最近更新 更多