2017-07-19 10 views
1

要約 - テーブルに存在する行数またはデータエントリの量と同じ変数を設定します。Pythonを使用してBigQueryテーブルの行数をカウントします。

私は過去1週間に私のアプリで使用されたデバイスの量を数えるPythonスクリプトでクエリを実行しています。私は、別のシリアル番号を数えることでこれを行います。現在、このクエリを使用しています。

#standardsql 
SELECT count(distinct serial) 
FROM `dataworks-356fa.FirebaseArchive.test2` 
Where (PeripheralType = 1 or PeripheralType = 2 or PeripheralType = 12) 
AND EXTRACT(WEEK FROM createdAt) = EXTRACT(WEEK FROM CURRENT_TIMESTAMP()) - 1 
AND serial != 'null' 

このコードを使用して、私のpythonスクリプトの後の時点で、この結果をスラックに送信します。

with open('Count_BB_Serial_weekly.json', 'r') as lowfile: 
    low = json.load(lowfile) 

low1 = low["f0_"] 

f0_個別のシリアル番号の量は、今、私はまた、使用される異なるシリアル番号の量と一緒に使用されているシリアル番号を見ることができる機能を追加したい、しかし

を数え= 。シリアル番号を照会する照会は、count(distinct)の部分を除いて上記と同様です。 low1をテーブル内の行の数と同じに設定できる方法はありますか?シリアル番号の一覧を表示するカウント機能を実行できないためです。うまくいけば、あなたはこれに従うことができます。混乱があれば、私はコメントでそれを扱います。

ありがとうございました!

+0

これは実際にはbigqueryテーブルではなくJSONからの値を実際に引き出していることに気付きました。それで、JSONに存在するエントリの数を数えることは可能ですか? –

+0

PythonでJSONの項目を数えるには、 'len'演算子を使用します。それでも、あなたの質問から理解したところから、このjsonはBQで実行されたクエリの結果です。これは、すでに処理されている行の合計を含む結果(f1_'など)に別のフィールドを持たせる方が良いかどうか疑問に思っています(BQにはPythonではなく作業をさせてください)。 –

+0

PythonでJSONの項目を数えるには、 'len'演算子を使用します。それでも、あなたの質問から私が理解したことから、このJSONはBQで実行されたクエリの結果です。この場合、すでに処理されている行の合計を含む結果(f1_'など)に別のフィールドを持たせる方がいいでしょうか(BQにはPythonではなく作業をさせてください)。 –

答えて

3

おそらくこの結果を既にBigQueryで取得している可能性があります。例えば:中

#standardSQL 
WITH data AS(
    SELECT '1' AS serial UNION ALL 
    SELECT '2' as serial UNION ALL 
    SELECT '3' AS serial UNION ALL 
    SELECT '1' AS serial 
) 

SELECT 
    ARRAY_AGG(DISTINCT serial) distinct_serials, 
    ARRAY_LENGTH(ARRAY_AGG(DISTINCT serial)) total_serials 
FROM 
    data 

結果:

[{"serials": ["serial_1", "serial_2", (...)], "total_serials": 10}]

#standardsql 
SELECT 
    ARRAY_AGG(serial) serials, 
    ARRAY_LENGTH(ARRAY_AGG(serial)) total_serials 
FROM(
SELECT distinct serial AS serial 
FROM `dataworks-356fa.FirebaseArchive.test2` 
Where (PeripheralType = 1 or PeripheralType = 2 or PeripheralType = 12) 
AND EXTRACT(WEEK FROM createdAt) = EXTRACT(WEEK FROM CURRENT_TIMESTAMP()) - 1 
AND serial != 'null') 

結果のようなものでなければなりません:

[ 
    { 
    "distinct_serials": [ 
     "2", 
     "1", 
     "3" 
    ], 
    "total_serials": "3" 
    } 
] 

またはあなたのクエリでは、それが何かのようになります

シリアルとARRAY、そして合計エントリーを持つ別のフィールドがあります。

+0

これを実行しようとしていますが、BigqueryはARRAY_AGG()のシリアル名が認識できないというエラーを出しています。そんなことがあるものか? –

+0

は私の答えを編集しました。別名がありません –

+0

それは完全に動作します。ありがとうございました –

関連する問題