2017-01-24 21 views
0

Java APIを使用して既存のテーブルを使用して新しいタイムパーティションにデータを挿入する方法を理解しようとしています。私のようなものでCLI経由でこれを行うことができる午前:Java APIに挿入クエリを含むタイムパーティションを含める方法

クエリ--use_legacy_sql = falseを--allow_large_resultsが--destination_table --replace BQ 'analytics.base_client_qos $ 20170104'「SELECT *、CAST(SUBSTR(event_date_pst 、analytics.client_qos_tempからDTとしてDATE AS 0、10))」

私のような何か使ってJava APIを経由して、これを作成してみました:と

String projectId = "analytics-145623"; 
String datasetId = "analytics"; 
String destTableId = "'analytics.base_client_qos$20170104'"; 
String queryString = "'SELECT *, CAST(SUBSTR(event_date_pst, 0, 10) AS DATE) as dt from analytics.client_qos_temp'"; 

// first create the new time partition 
TableReference tableRef = new TableReference() 
    .setProjectId(projectId) 
    .setDatasetId(datasetId) 
    .setTableId(destTableId); 
Table table = new Table(); 
TimePartitioning timePartitioning = new TimePartitioning(); 
timePartitioning.setType("DAY"); 
table.setTimePartitioning(timePartitioning); 
table.setTableReference(tableRef); 
Bigquery.Tables.Insert request = client.tables().insert(projectId, datasetId, table); 
Table response = request.execute(); 

// next run query to insert the data 
JobConfigurationQuery queryConfig = new JobConfigurationQuery() 
    .setQuery(querySql) 
    .setDestinationTable(tableRef) 
    .setAllowLargeResults(true) 
    .setUseLegacySql(false) 
    .setPriority("BATCH") 
    .setWriteDisposition("WRITE_TRUNCATE"); 
Job job = new Job().setConfiguration(new JobConfiguration().setQuery(queryConfig)); 
client.jobs().insert(projectId, job).execute(); 

が、このエラーアウト:

{ 
    "code" : 400, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Invalid table ID \"'analytics.base_client_qos$20170104'\".", 
    "reason" : "invalid" 
    } ], 
    "message" : "Invalid table ID \"'analytics.base_client_qos$20170104'\"." 
} 

私はAPIドキュメントを掘りましたが、タイムパーティション情報を追加できる唯一の場所はTimePartitioningのテーブルにありますが、明らかに機能していないし、パーティション名でハングアップしています。

私は何が欠けていますか?私はこれを行う例を見つけようとしましたが、運はありません。誰もこれを行う方法を知っていますか?

答えて

0

新しいテーブルを作成するときは、コールでanalytics.base_client_qosを使用するだけで、パーティションサフィックス$20170104を使用しないでください。 しかし、時にクエリのあなたが.setDestinationTable、より密接に見た後analytics.base_client_qos$20170104

0

パーティション名を使用して、私は()テーブルに対して決め、それを表にレコードのストリーミングのためであるので、これはちょうど仕事に行くのではありません私たちが持っているボリュームのために。私は別の質問をして、一時テーブルをスキップし、ハイブで前処理を行い、挿入クエリの代わりに負荷を使用することにしました。一緒に来て隣の男のために、それはこのような何かを行ってきました:

String cloudStoragePath = "gs://analytics-145623.appspot.com/user/hive/warehouse/di.db/base_client_qos_daily/year=2017/month=1/day=4/*.avro"; 
String projectId = "analytics-145623"; 
String datasetId = "analytics"; 
String destTableId = "base_client_qos$20170104"; 

TableReference tableRef = new TableReference() 
    .setProjectId(projectId) 
    .setDatasetId(datasetId) 
    .setTableId(destTableId); 

JobConfigurationLoad loadTable = new JobConfigurationLoad() 
    .setDestinationTable(tableRef) 
    .setSourceFormat("AVRO") 
    .setSourceUris(Collections.singletonList(cloudStoragePath)) 
    .setWriteDisposition("WRITE_TRUNCATE"); 
Job loadJob = client.jobs().insert(table.getProjectId(), 
         new Job().setConfiguration(new JobConfiguration().setLoad(loadTable)) 
        ).execute(); 
Bigquery.Jobs.Get tempTableGet = client.jobs() 
    .get(tempTableJob.getJobReference().getProjectId(), 
    tempTableJob.getJobReference().getJobId()); 

Job jobResult = BigQueryUtils.pollJob(tempTableGet, interval); 
if (jobResult == null || jobResult.getStatus().getErrorResult() != null) { 
    System.out.println("Error when overwritting temp table: " + 
      jobResult.getStatus().getErrorResult().getReason()); 
} 

HTH

関連する問題