2017-07-19 14 views
1

BigQueryにURLクエリー文字列を含む列があります(例:a=1&c=1)。私はこれらの質問の一部を私の質問で参考にしたいと思います。 WHERE querystring.c = 1などでフィルタリングしてください。BigQueryでのクエリ文字列の解析

私の計画は、クエリ文字列をJSONに変換し、JSON_EXTRACTを使用することです。私は、クエリーストリングをJSONに変換するUDFを書くことができると考えましたが、これを簡単にするためにnode.js querystring packageをUDFにインポートすることはできません。

node.jsコアライブラリをUDFにインポートすることはできますか?あるいは、私がやろうとしていることを達成するための良い方法がありますか?

答えて

1

また、私がしようとしていることを達成するためのよりよい方法がありますか?

私はそう思います - はい - JS UDFを使用するのは高価なリソースであり、いくつかの制限があります。使用してSQL UDFは、安価であり、あなたはあなたがSQL UDFを使用することにより、以下の変換することができますしたい場合 - しかし、少なくとも以下のあなたにBigQueryの標準SQL

#standardSQL 
WITH yourTable AS (
    SELECT 1 AS id, 'a=1&c=1' AS querystring UNION ALL 
    SELECT 2, 'c=2&b=3' 
) 
SELECT 
    id, 
    querystring, 
    SPLIT(kv, '=')[SAFE_OFFSET(0)] AS key, 
    SPLIT(kv, '=')[SAFE_OFFSET(1)] AS value 
FROM yourTable, UNNEST(SPLIT(querystring, '&')) AS kv 

は、上記のことができますについては、「代替」アプローチ

のアイデアを提供しますあなたはだから今、あなたが

0以下のようなWHERE句でそれらを使用することができ

id querystring key value  
2 c=2&b=3  b 3  
1 a=1&c=1  c 1  
1 a=1&c=1  a 1  
2 c=2&b=3  c 2  

以下のようにすべてのキーと値のペアを「抽出」します

これは

id querystring 
1 a=1&c=1  

注結果の下に与える:これはアプローチのちょうど迅速かつ抽象的実例である - 私はあなたの特定のケース

以下

に採用/それを調整することを願っていますが、に上記変換の一例です通常のキーの重複を持っていないクエリ文字列 - そうDUPを有する場合には対処されていない - しかし、簡単に、必要な場合に:SQL UDF

#standardSQL 
CREATE TEMPORARY FUNCTION parse(qs STRING, key STRING) AS (
    (SELECT SPLIT(kv, '=')[SAFE_OFFSET(1)] FROM UNNEST(SPLIT(qs, '&')) AS kv WHERE SPLIT(kv, '=')[SAFE_OFFSET(0)] = key) 
); 
WITH yourTable AS (
    SELECT 1 AS id, 'a=1&c=1' AS querystring UNION ALL 
    SELECT 2, 'c=2&b=3' 
) 
SELECT 
    id, 
    querystring 
FROM yourTable 
WHERE parse(querystring, 'c') = '1' 

注意を使用O)

ただし、エンコードされたコンポーネントはデコードされないため、値には%20などの値が含まれます。それに関する提案はありますか?

#standardSQL 
CREATE TEMPORARY FUNCTION parse(qs STRING, key STRING) AS (
    (SELECT SPLIT(kv, '=')[SAFE_OFFSET(1)] FROM UNNEST(SPLIT(qs, '&')) AS kv WHERE SPLIT(kv, '=')[SAFE_OFFSET(0)] = key) 
); 
CREATE TEMP FUNCTION decode(str STRING) 
RETURNS STRING 
LANGUAGE js AS """ 
    if (str == null) return null; 
    try { 
    return decodeURIComponent(str); 
    } catch (e) { 
    return str; 
    } 
"""; 
WITH yourTable AS (
    SELECT 1 AS id, 'a=1&c=1&d=a%20b%20c' AS querystring UNION ALL 
    SELECT 2, 'c=2&b=3' 
) 
SELECT 
    id, 
    querystring, 
    decode(parse(querystring, 'd')) as d 
FROM yourTable 
WHERE parse(querystring, 'c') = '1' 

結果は、これは素晴らしいアプローチですが、私の値はまだ20%のようなものが含まれていますので、それは、任意のエンコードされたコンポーネントをデコードしない

id querystring    d  
-- -------------------  ----- 
1 a=1&c=1&d=a%20b%20c  a b c  
+0

です。それに関する提案はありますか? –

+0

良い点。あなたの質問を、クエリ文字列からキー/値を解析/抽出する方法にもっと似ていました。 1つの答えですべてのニュアンスをカバーするのは難しいです。私はあなたにURLデコーディングに固有の新しい質問をすることをお勧めします - 私はこれに問題が見られません - あなたは答えを得る良いチャンスを持っています - しかし、私は1つの投稿のすべてのニュアンスをカバーすると言っていたように現実的ではありません: –

+0

私の答えの更新を参照してください:o)。 –