2016-04-17 9 views
4

これはジョーダンがここに答えるに関するフォローアップの質問だ:Weird error in BigQueryエラー:TABLE_QUERY式はBigQueryのテーブルを照会することはできません

私はいくつかの時間を終了するための「Table_Query」内の参照テーブルを照会するために使用していました。さて、Joradanが言及している最近の変更に続いて、多くのクエリが壊れています...私たちがやっていることに対する代替的な解決策についてコミュニティのアドバイスをお願いしたいと思います。

私はイベント( "MyTable_YYYYMMDD")を含むテーブルを持っています。特定の(または複数の)キャンペーン期間にデータを照会したいのですが。そのキャンペーンの期間は、すべてのキャンペーンデータ(ID、StartCampaignDate、EndCampaignDate)を含む表に保存されます。関連するテーブルのみを照会するために、Table_Query()を使用し、TableQuery()内で、キャンペーンデータに基づいて関連するすべてのテーブル名のリストを作成します。 このクエリは、さまざまなパラメータでさまざまな形で何度も実行されます。パフォーマンス、実行コスト、およびメンテナンスコストが、(データセット全体を照会するのではなく)ワイルドカード機能を使用する理由です。したがって、すべてのテーブルをクエリして結果をフィルタリングするだけでは、実行コストが高すぎるため、オプションではありません。 - 表はお問合せはあなたが唯一の照会だろうか、参照テーブルに格納されなければならない情報、

SELECT 
    * 
FROM 
    TABLE_QUERY([MyProject:MyDataSet] 'table_id IN 
    (SELECT CONCAT("MyTable_",STRING(Year*100+Month)) TBL_NAME 
    FROM DWH.Dim_Periods P 
    CROSS JOIN DWH.Campaigns AS LC 
    WHERE ID IN ("86254e5a-b856-3b5a-85e1-0f5ab3ff20d6") 
    AND DATE(P.Date) BETWEEN DATE(StartCampaignDate) AND DATE(EndCampaignDate))') 

この今壊れている... 私の質問を:

サンプルクエリは次のようになります"TableQuery"が参照テーブルを照会できなくなったときに関連するテーブル(パーティション)

感謝

私が見る「シンプル」な方法は、2つのステップ
ステップ1にそれを分割され

答えて

2

- クエリでのtable_idの

SELECT GROUP_CONCAT_UNQUOTED(
        CONCAT('"',"MyTable_",STRING(Year*100+Month),'"') 
     ) TBL_NAME_LIST 
FROM DWH.Dim_Periods P 
CROSS JOIN DWH.Campaigns AS LC 
WHERE ID IN ("86254e5a-b856-3b5a-85e1-0f5ab3ff20d6") 
AND DATE(P.Date) BETWEEN DATE(StartCampaignDate) AND DATE(EndCampaignDate) 

注変更をフィルタリングするために使用されるリストを作成最後のクエリ

SELECT 
    * 
FROM 
    TABLE_QUERY([MyProject:MyDataSet], 
       'table_id IN (<paste list (TBL_NAME_LIST) built in first query>)') 
- 手順2

ステップ2で使用することをリストアップし、結果を変換します上記の手順を

はあなたのBigQueryウェブUIの中からそれを使用する場合は、潜在的に
を使用して、任意のクライアントで実装するのは簡単です - これはあなたが私の

程度満足していない可能性があります少し余分マニュアル「移動」を行います答えは明白であり、オプションとして既にこれを持っている可能性が最も高いですが、言及したかった

+0

本当にありがとうございました。このソリューションを検討しました。しかし、私は複数のステップクエリを避けることを好む...私は、ロジックがいくつかの場所に散在しているので、時間が経つにつれて複雑になるメンテナンスに関心があり、プロセスで可能性の高い障害ポイントがあります。 –

+0

あなたが求めている問題の回避策を探しているなら、これはあなたが持っているものです。 Googleチームのポイントやリクエストをしようとしている場合は、https://code.google.com/p/google-bigquery/:oを使用することをお勧めします。回答が大好きですが、時間を無駄にすることはありませんこれに問題はありません - それはあなたに適切なチャンネルを指し示すことが多いです –

+0

Mikahil、私はポイントを作ろうとしている誰かのNNのコメントを読んでいません。彼はちょうどあなたの解が準最適であることを指摘しました。私が見る限り、彼は有効な議論をしています。ソリューションのもう1つの問題は、クエリのパフォーマンスにも影響することです。うまくいけば、もう一つの回避策があります。あるいは、Googleによって最終的に提供されるでしょう – Zvi

0

これは理想的な解決策ではありません。しかし、それは仕事をするようです。

以前のクエリでは、クエリを構築した外部プロセスのパラメータとしてIDリストを渡しました。私は、このプロセスがクエリに実装されているどのロジックにも気づかないことを望んでいました。

は、最終的には、この解決策を考え出した:

代わりにIDのリストを渡すので、私たちはそれぞれのIDに関連するメタデータが含まれているJSONを渡します。このJSONをTable_Query()関数内で解析します。したがって、物理参照テーブルを照会するのではなく、JSONに入れた「テーブル変数」を照会します。
以下は、このソリューションを示すパブリックデータセットで実行されるサンプルクエリです。

SELECT 
    YEAR, 
    COUNT (*) CNT 
FROM 
    TABLE_QUERY([fh-bigquery:weather_gsod], 'table_id in 
(Select table_id 
From 
(Select table_id,concat(Right(table_id,4),"0101") as TBL_Date from [fh-bigquery:weather_gsod.__TABLES_SUMMARY__] 
where table_id Contains "gsod" 
)TBLs 
CROSS JOIN 
(select 
Regexp_Replace(Regexp_extract(SPLIT(DatesInput,"},{"),r"\"fromDate\":\"(\d\d\d\d-\d\d-\d\d)\""),"-","") as fromDate, 
Regexp_Replace(Regexp_extract(SPLIT(DatesInput,"},{"),r"\"toDate\":\"(\d\d\d\d-\d\d-\d\d)\""),"-","") as toDate, 
FROM 
(Select 
"[ 
     { 
     \"CycleID\":\"123456\", 
     \"fromDate\":\"1929-01-01\", 
     \"toDate\":\"1950-01-10\" 
     },{ 
     \"CycleID\":\"123456\", 
     \"fromDate\":\"1970-02-01\", 
     \"toDate\":\"2000-02-10\" 
     } 
    ]" 
    as DatesInput)) RefDates 
    WHERE TBLs.TBL_Date>=RefDates.fromDate 
    AND TBLs.TBL_Date<=RefDates.toDate 
)') 
GROUP BY 
    YEAR 
ORDER BY 
    YEAR 

このソリューションは、参照テーブルに格納されたデータを認識するために外部プロセスを必要とするため、理想的ではありません。 BigQueryチームが理想的にこの非常に便利な機能を再び有効にします。

関連する問題