使用 Redshift Spectrum 查询 Hive 视图

Query Hive view with Redshift Spectrum

我正在尝试使用 Redshift Spectrum 查询 Hive 视图,但出现此错误:

SQL Error [500310] [XX000]: [Amazon](500310) Invalid operation: Assert
Details: 
 -----------------------------------------------
  error:  Assert
  code:      1000
  context:   loc->length() > 5 && loc->substr(0, 5) == "s3://" - 
  query:     12103470
  location:  scan_range_manager.cpp:272
  process:   padbmaster [pid=1769]
  -----------------------------------------------;

是否可以从 Redshift Spectrum 查询 Hive 视图?我正在使用 Hive Metastore(不是 Glue 数据目录)。

我想要一个视图来限制对原始 table 的访问,其中包含一组有限的列和分区。而且因为我原来的 table (Parquet 数据)有一些 Map 字段所以我想做类似的事情以便从 Redshift 查询更容易,因为 Map 字段在 Redshift 中处理起来有点复杂:

CREATE view my_view AS
SELECT event_time, event_properties['user-id'] as user_id, event_properties['product-id'] as product_id, year, month, day
FROM my_events
WHERE event_type = 'my-event'  -- partition

我可以从 Spectrum 查询 table my_events 但它很乱,因为 properties 是一个 Map 字段,而不是 Struct,所以我需要在 Redshift 中将它分解成几行。

谢谢

查看错误,似乎在查询外部表和视图时 Spectrum 总是寻找 S3 路径。 这对外部表有效,因为它们总是有一个位置,但视图永远不会有一个明确的 S3 位置。

Error type    -> Assert
Error context -> context: loc->length() > 5 && loc->substr(0, 5) == "s3://"

如果是蜂巢视图, loc->length() 将 return 0,整个语句将 return False 并导致断言错误。

对此的确认可以是第二个条款:

loc->substr(0, 5) == "s3://"

它期望位置是 S3 路径,如果我们计算 "s3://" 中的字符数,它是 5,这也证实了第一个子句:

loc->length() > 5

看起来 Spectrum 不支持 Hive 视图(或者通常不支持任何没有显式 S3 路径的对象)