我正在加入两个文件。一个文件是table(in0 port)
的提取,其记录格式类似于此utf8 string("\x01", maximum_length=3)
另一个文件是普通text file(in1 port)
,其记录格式与此ascii string(3)
相同。
加入时我收到以下错误:
Field "company" in key specifier for input in1 has type "ascii string(3)",
but field "kg3_company_cd" in key specifier for input in0 has type "utf8 string("\x01", maximum_length=3)".
This join may be attempted in spite of the type mismatch by
setting configuration variable AB_ALLOW_DANGEROUS_KEY_CASTING to true.
However, typically the input streams will have been hash-partitioned on
the join keys of different types, making it unlikely that all equal join.
答案 0 :(得分:0)
问题是utf8字符串和ascii字符串是不同的底层数据,以表示相同的值。您收到的错误消息警告您,如果您的连接并行运行,则散列分区算法可能会将每个流的匹配键值发送到不同的分区,因为表示“相等”字符串的基础数据不同。例如:如果两个流都有3个记录,每个记录的键字段值为(“A”,“AB”,ABC“),则键”AB“可能在一个流的分区0上,而另一个流上的分区7。 join组件将为每个分区运行一个实例,期望数据被正确分区。分区0的实例将在一个流上看到键“AB”而在另一个流上看不到。如果它是内部联接,您将只看到那些匹配巧合地发送到输出上的同一分区的密钥记录。
您应该选择所需的字符串编码,并确保两个流在连接之前具有匹配的编码。只需在之前添加重新格式化。