【问题标题】:Redshift showing 0 rows for external table, though data is viewable in AthenaRedshift 显示外部表的 0 行,但在 Athena 中可以查看数据
【发布时间】:2019-02-02 12:13:21
【问题描述】:

我在 Redshift 中创建了一个外部表,然后将一些数据添加到指定的 S3 文件夹中。我可以在 Athena 中完美地查看所有数据,但我似乎无法从 Redshift 查询它。奇怪的是 select count(*) 有效,这意味着它可以找到数据,但实际上不能显示任何内容。我猜这是某个地方的一些错误配置,但我不确定是什么。

一些可能相关的东西(我匿名了一些东西):

create external schema spectrum_staging
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::############:role/RedshiftSpectrumRole'
create external database if not exists;

create external table spectrum_staging.errors(
  id varchar(100),
  error varchar(100))
stored as parquet
location 's3://mybucket/errors/';

我的样本数据存储在 s3://mybucket/errors/2018-08-27-errors.parquet

此查询有效:

db=# select count(*) from spectrum_staging.errors;
 count
-------
    11
(1 row)

这个查询没有:

db=# select * from spectrum_staging.errors;
 id | error 
----+-------
(0 rows)

【问题讨论】:

    标签: amazon-s3 amazon-redshift parquet amazon-athena amazon-redshift-spectrum


    【解决方案1】:

    检查您的 parquet 文件并确保 Spectrum 表中的列数据类型匹配。

    然后在查询后运行SELECT pg_last_query_id(); 以获取查询编号并查看系统表STL_S3CLIENTSTL_S3CLIENT_ERROR 以查找有关查询执行的更多详细信息。

    【讨论】:

    • 感谢您的回复。类型匹配(据我所知)。我用 varchar(100) 创建了表,并用 'UTF8' 写了它们。镶木地板检查员向我展示了镶木地板文件的类型:id:BYTE_ARRAY UTF8,错误:BYTE_ARRAY UTF8。我尝试了其他步骤,但没有得到太多信息。也许我做错了? db=# select * from spectrum_staging.errors; (0 rows) db=# SELECT pg_last_query_id(); (330810) db=# select * from stl_s3client where query=330810; (0 rows) db=# select * from stl_s3client_errors where query=330810; (0 rows)
    【解决方案2】:

    当您基于 Glue 数据目录定义了外部架构时,您不需要定义外部表。 Redshift Spectrum 会列出 Catalog 中的所有表。

    可能发生的情况是,您不知何故有两个具有相同名称的东西,在一种情况下,它从数据目录中获取它,而在另一种情况下,它尝试使用外部表。

    从 Redshift 端检查这些表,以更好地了解其中的内容: select * from SVV_EXTERNAL_SCHEMAS select * from SVV_EXTERNAL_TABLES select * from SVV_EXTERNAL_PARTITIONS select * from SVV_EXTERNAL_COLUMNS

    这些表用于使用来自外部架构的表的查询: select * from SVL_S3QUERY_SUMMARY select * from SVL_S3LOG order by eventtime desc select * from SVL_S3QUERY where query = xyz select * from SVL_S3PARTITION where query = xyz

    【讨论】:

    • 我之前没有尝试过使用 AWS Glue。无论如何,我看到了我在数据目录中创建的外部表。我不认为有重复的问题,因为如果我从数据目录中删除它,它就会从外部表列表中消失。运行您的查询,架构、表和列位于 SVV_EXTERNAL_* 中(数据未分区,因此 PARTITIONS 中没有任何内容)。 S3LOG 中没有错误。奇怪的是它确实在 S3_QUERY 中找到了 parquet 文件。但是 s3_scanned_rows 和 returned_rows 为 0。 s3_scanned_bytes 表明它读取了每个 parquet 文件。还有其他想法吗?
    • 也许再看看文件创建。可能是 Parquet 文件中的字段大写或其他一些类似的随机废话(ID 与 id)。 AWS Glue 数据目录/表定义由于某种原因不能很好地处理大写字母。
    【解决方案3】:

    对此是否有解决方案?一年下来,我今天也有同样的问题。 在架构差异方面没有什么突出的 - 虽然存在错误

    select recordtime, file, process, errcode, linenum as line,
    trim(error) as err
    from stl_error order by recordtime desc;
    

    /home/ec2-user/padb/src/sys/cg_util.cpp padbmaster 1 601 段编译失败:/rds/bin/padb.1.0.10480/data/exec/227/48844003/de67afa670209cb9cffcd4f6a61e1c32a5b3dccc/0

    不知道这是什么意思。

    【讨论】:

    • 我与 AWS 取得了联系,显然 Redshift 频谱中存在一个错误,无法解析使用十进制 + 二进制组合创建的镶木地板。解决方法是使用固定长度的二进制数组而不是二进制。
    【解决方案4】:

    我在使用 RegexSerDe 行格式在 Athena 中创建外部表时遇到了类似的问题。我能够从 Athena 查询这个外部表而没有任何问题。但是,从 Redhift 查询外部表时,结果为空。

    通过转换为拼花格式解决,因为 Spectrum 无法处理正则表达式序列化。

    请看下面的链接:

    Redshift spectrum shows NULL values for all rows

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2022-01-22
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多