【问题标题】:Why is DataStage writing NULL string values as empty strings, while other data types correctly have NULL values为什么 DataStage 将 NULL 字符串值写入为空字符串,而其他数据类型正确具有 NULL 值
【发布时间】:2022-07-22 16:06:41
【问题描述】:

我有一个 DataStage 并行作业,它作为长期作业的最后阶段写入 Hive。可以查看即将写入的数据,在Hive表中有很多NULL想查看的字符串。

但是,当我查看创建的表时,没有 NULL 字符串,它们都被转换为空字符串 ''。我可以看到其他数据类型,例如 DECIMAL(5,0) 有 NULL 值,我可以选择这些,例如

SELECT * FROM mytable WHERE decimal_column IS NULL;

写入 Hive 的过程是将数据以分隔文本格式存储在临时表中。然后通过通用 CDC 进程推送,并导致数据写入 ORC 格式表中的新分区。

我能看到的用于处理 NULL 值的唯一选项是 HDFS 文件连接器阶段中的“Null Value”。如果我把这个留空,那么我会得到空字符串,如果我输入“NULL”,那么“NULL”就是我得到的,即不是NULL,而是字符串“NULL”。

我无法更改流程,因为它已经适用于数以千计的工作。有什么方法可以让我的字符串值为NULL 还是我被空字符串困住了?

【问题讨论】:

    标签: hive hdfs datastage


    【解决方案1】:

    根据 IBM 文档,双引号 "" 中的空字符串应该会有所帮助。

    空值

    指定表示数据中空值的字符或字符串。对于源阶段,输入具有值的数据 您指定的在输出链接上设置为 null。对于一个目标 阶段,在写入文件系统的输出文件中,null 值由为此指定的值表示 财产。 要指定一个空字符串代表一个空值, 指定 ""(两个双引号)。

    来源:https://www.ibm.com/docs/en/iis/11.7?topic=reference-properties-file-connector

    【讨论】:

    • 我对此进行了测试,但它似乎没有做任何事情。我认为默认行为是将 NULL 字符串存储为空字符串,即 "" ,所有这些都是为了确认该行为。我希望将 NULL 字符串存储为 NULL 值,就像它已经为日期、小数等所做的那样。
    • 您是否尝试在输出级之前的转换器中放入类似If Len(Trim(mylink.mystring1)) = 0 Then SetNull() Else mylink.mystring1 的内容,这样该级得到的不是空字符串而是空值?
    • 是的,它没有用。如果我将最终输出写入数据集,那么我会看到字符串的 NULL。只有当我将它写入 HDFS 时,它才会将 NULL 更改为空字符串。我可以用 HQL 脚本“修复”它,但我想知道为什么默认行为是这样做的,是否可以更改它
    猜你喜欢
    • 2012-12-29
    • 2015-04-05
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2010-09-17
    相关资源
    最近更新 更多