来自 S3 的 MemSQL 管道将 NULL 插入 DATE 类型列
MemSQL pipeline from S3 inserting NULLs into DATE type columns
Memsql 管道应该将数据从 S3 转储到列存储 table。源文件为 ORC 格式。然后将它们转换为 Parquet。
这些文件具有 DATE 数据类型 (yyyy-mm-dd) 的某些列。
管道运行正常,但将 NULL 插入所有 Date 类型列。
DATE 值可能会作为带有时间戳逻辑类型注释的 int64 写入 Parquet (https://github.com/apache/parquet-format/blob/master/LogicalTypes.md#timestamp)。 MemSQL 当前不会自动将它们转换为与例如兼容的格式。 DATETIME 或 TIMESTAMP,而是尝试分配给目标列,就像通过分配具有原始基础值的整数文字一样。由于 MySQL 兼容性原因,这会给出 NULL 而不是错误,尽管 set global data_conversion_compatibility_level="7.0"
会使它成为一个错误。
您可以通过临时给问题列 TEXT
类型并查看结果值来进行调查。如果它是一个整数字符串,问题如上所述,您可以使用 CREATE PIPELINE
的 SET
子句通过类似 CREATE PIPELINE P AS LOAD DATA .... INTO TABLE T(@col_tmp <- parquet_field_name) SET col = timestampadd(microsecond, @col_tmp, from_unixtime(0));
的方式将值转换为兼容格式。
该值将是自某个时区的 unix 纪元以来某个时间单位的计数。单位和时区取决于作者,但如果您知道它应该代表哪个时间,则应该清楚。一旦您知道了这一点,请修改上面的表达式以更正单位,并可能在必要时调用 convert_tz
。
是的,这很痛苦。我们将使它自动进行。
Memsql 管道应该将数据从 S3 转储到列存储 table。源文件为 ORC 格式。然后将它们转换为 Parquet。 这些文件具有 DATE 数据类型 (yyyy-mm-dd) 的某些列。
管道运行正常,但将 NULL 插入所有 Date 类型列。
DATE 值可能会作为带有时间戳逻辑类型注释的 int64 写入 Parquet (https://github.com/apache/parquet-format/blob/master/LogicalTypes.md#timestamp)。 MemSQL 当前不会自动将它们转换为与例如兼容的格式。 DATETIME 或 TIMESTAMP,而是尝试分配给目标列,就像通过分配具有原始基础值的整数文字一样。由于 MySQL 兼容性原因,这会给出 NULL 而不是错误,尽管 set global data_conversion_compatibility_level="7.0"
会使它成为一个错误。
您可以通过临时给问题列 TEXT
类型并查看结果值来进行调查。如果它是一个整数字符串,问题如上所述,您可以使用 CREATE PIPELINE
的 SET
子句通过类似 CREATE PIPELINE P AS LOAD DATA .... INTO TABLE T(@col_tmp <- parquet_field_name) SET col = timestampadd(microsecond, @col_tmp, from_unixtime(0));
的方式将值转换为兼容格式。
该值将是自某个时区的 unix 纪元以来某个时间单位的计数。单位和时区取决于作者,但如果您知道它应该代表哪个时间,则应该清楚。一旦您知道了这一点,请修改上面的表达式以更正单位,并可能在必要时调用 convert_tz
。
是的,这很痛苦。我们将使它自动进行。