2016-11-17 28 views
3

BigQuery通常在加載Avro數據方面做得很好,但「bq load」在使用Avro logicalType屬性的時間戳和其他日期/時間字段中遇到了很多問題。Avro日期和時間與BigQuery的兼容性?

  1. 當BigQuery TIMESTAMP將它們解釋爲微秒時間戳(關閉1000)時,我的數據與Avro類型timestamp-millis發生了衝突。
  2. 可以加載到TIMESTAMP中的timestamp-micros整數在BigQuery DATETIME中變爲INVALID。我找不到解釋什麼是有效的解釋https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types
  3. ISO8601格式的字符串不能加載到TIMESTAMP或DATETIME(不兼容的類型錯誤),但我認爲BigQuery會支持,如果我加載純JSON。
  4. Avro「date」類型無法加載到DATE(也是不兼容的類型)。

我想我可以通過總是將數據加載到臨時字段並使用CAST查詢或將它們轉換爲其他字段來解決這些問題,但這並不會擴展或支持模式演變或流式傳輸。在Avro中用明確定義的模式生成數據應該避免爲不同消費者再次轉換數據的額外步驟。

BigQuery真的與Avro日期和時間不兼容嗎? (或者我在做什麼愚蠢的事情)

或者是「bq load」這裏的問題?有沒有更好的方法來加載Avro數據?

+0

具有樣品文件可以幫助調試此問題(如果它是一個錯誤:

% avro-tools getschema ~/dataset/simple_timestamp.avro { "type" : "record", "name" : "FullName", "fields" : [ { "name" : "t", "type" : "long" } ] } 

加載的Avro文件表一中時間戳字段的示例,在這裏發帖https://code.google.com/p/google-bigquery/issues/list) –

+0

我不知道它是一個bug還是BigQuery不支持將Avro數據加載到TIMESTAMP,DATETIME和DATE數據類型。 https://cloud.google.com/bigquery/data-formats#avro_format沒有提及這三種類型中的任何一種。我不知道如何在這裏附加二進制Avro數據文件。 – Kevin

回答

3

BigQuery不支持邏輯類型。 BigQuery使用Apache庫的C++版本。我剛剛檢查過,C++庫還沒有支持邏輯類型。

2

我有PostgreSQL表中的數據與TIMESTAMP列。根據https://github.com/spotify/spark-bigquery/issues/19的意見,我可以通過Avro將其導入到BigQuery中。

在科特林使用PostgreSQL JDBC庫,我重新計算時間戳into BigQuery internal format(微秒因爲Unix紀元的開始)

(object as java.sql.Timestamp).time * 1000 

,並把它放到我的Avro紀錄Schema.Type.LONG類型。

然後我created a schema file for my data in JSON其中我給列類型的「時間戳」。

[ {"name": "job", "type": "string", "mode": "required"}, ... {"name": "began", "type": "timestamp", "mode": "required"}, ... ]

(見開始字段)

最後,我導入到BigQuery的與

bq mk test.test2 dataset.avro schema.json 

結果是

$ bq head test.test2 +------+----+----------+---------------------+---------+-----------+ | job | id | duration | began | status | node_name | +------+----+----------+---------------------+---------+-----------+ | job1 | 1 | 0.0 | 2012-04-01 00:00:00 | aStatus | aNodeName | | job2 | 1 | 0.0 | 2020-02-02 00:02:02 | aStatus | aNodeName | +------+----+----------+---------------------+---------+-----------+

在Web UI做不允許指定模式對於Avro文件,但CLI客戶端和API都可以。

我仍然遇到的唯一問題是處理時區。但是這對Avro來說不是問題。

1

正如Hua所言,Avro邏輯類型在BigQuery中不受支持,但支持使用時間戳加載Avro數據的方式是使用LONG Avro類型將數據加載到具有TIMESTAMP列的現有BigQuery表中。另外,該值應該是來自EPOCH的微秒(而不是秒或毫秒)。例如,下面的Avro文件有一個值爲1408452095000000的LONG字段,它將表示「2014-08-19 12:41:35」。

的Avro的文件的架構:

bq mk --schema t:TIMESTAMP -t vimota.simple_timestamp 
bq load --source_format=AVRO vimota.simple_timestamp ~/dataset/simple_timestamp.avro 
bq head vimota.simple_timestamp: 

+---------------------+ 
|   t   | 
+---------------------+ 
| 2014-08-19 12:41:35 | 
+---------------------+ 
相關問題