1

クエリを最適化する方法を探しています。

という名前のイベントを含むテーブルがありlea、列app_propertiesはタグであり、カンマ区切りの文字列として保存されています。

目的のタグを選択するクエリの結果に一致するすべてのイベントを選択したいと考えています。

私の最初の試み:

SELECT uuid, app_properties, tag
FROM events
LATERAL VIEW explode(split(app_properties, '(, |,)')) tag_table AS tag
WHERE tag IN (SELECT source_value FROM mapping WHERE indicator = 'Bandwidth Usage')

しかし、Hive はこれを許可しません...

FAILED: SemanticException [Error 10249]: Line 4:6 Unsupported SubQuery Expression 'tag': Correlating expression cannot contain unqualified column references.

運ではなく、置き換えてもう一度試してみましたWHERE tag IN...WHERE tag_table.tag IN

FAILED: SemanticException Line 4:6 Invalid table alias tag_table' in definition of SubQuery sq_1 [tag_table.tag IN (SELECT source_value FROM mapping WHERE indicator = 'Bandwidth Usage')] used as sq_1 at Line 4:20.

最後に...以下のクエリは望ましい結果をもたらしますが、これはこのユースケースを解決するための最も最適化された方法ではないと感じています。LATERAL VIEWaを使用して aからの選択が必要な同じユースケースに遭遇した人はいますSub queryか?

SELECT to_date(substring(events.time, 0, 10)) as date, t2.code, t2.indicator, count(1) as total
FROM events
LEFT JOIN (
    SELECT distinct t.uuid, im.code, im.indicator
    FROM mapping im
    RIGHT JOIN (
      SELECT tag, uuid
      FROM events
      LATERAL VIEW explode(split(app_properties, '(, |,)')) tag_table AS tag
      ) t
    ON im.source_value = t.tag AND im.indicator = 'Bandwidth Usage'
    WHERE im.source_value IS NOT NULL
) t2 ON (events.uuid = t2.uuid)
WHERE t2.code IS NOT NULL
GROUP BY to_date(substring(events.time, 0, 10)), t2.code, t2.indicator;
4

1 に答える 1

1

WHERE 句の Hive サブクエリは、次のように IN、NOT IN、EXIST、または NOT EXIST と共に使用できます。エイリアス (employee テーブルの次の例を参照) が WHERE 条件の列 (名前) の前に指定されていない場合、Hive はエラー Correlating expression cannot contain unqualified column references を報告します。これは、Hive サブクエリの制限です。

Apache Hive Essentials から。

この問題もサブクエリが原因だと思います。イベントにはエイリアスが必要です

于 2016-08-17T02:20:26.040 に答える