【问题标题】:IO exception while inserting data in table on Big Query在 Big Query 上的表中插入数据时出现 IO 异常
【发布时间】:2017-03-21 18:03:20
【问题描述】:

我正在尝试在大查询的表中插入数据。我关注了一些文档,我的最终代码看起来像

   HttpTransport TRANSPORT = new NetHttpTransport();
    JsonFactory JSON_FACTORY = new JacksonFactory();
    List<String> SCOPES = Arrays
            .asList(BigqueryScopes.BIGQUERY);

    GoogleCredential credential = null;
    AssetManager am = this.getAssets();
    InputStream inputStream = null;
    try {
        inputStream = am.open("hbhjb-8f79f6642470.p12");
    } catch (IOException e2) {
        e2.printStackTrace();
    }


    File file = createFileFromInputStream(inputStream, this);


    try {
        credential = new GoogleCredential.Builder().setTransport(TRANSPORT)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId("projectnum-*******************3ee3130770087ceab09a482173@developer.gserviceaccount.com")
                .setServiceAccountScopes(SCOPES)
                .setServiceAccountPrivateKeyFromP12File(file)
                .build();
    } catch (GeneralSecurityException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    Bigquery bigquery = new Bigquery.Builder(TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName("BigQuery-Service-Accounts/0.1")
            .setHttpRequestInitializer(credential).build();

    TableRow data = new TableRow();
    data.set("callerNumber", "123456789");


   TableDataInsertAllRequest.Rows row = new TableDataInsertAllRequest.Rows();
    row.setInsertId(System.currentTimeMillis()+"");
    row.setJson(data);
    TableDataInsertAllRequest requests = new TableDataInsertAllRequest();
    requests.setRows(Arrays.asList(row));

    TableDataInsertAllResponse response = null;
    try {
        response = bigquery.tabledata().insertAll("projectNum", "Data", "CallersData", requests).execute();
        Log.d("big query response", response.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }

    for (TableDataInsertAllResponse.InsertErrors err: response.getInsertErrors()) {
        for (ErrorProto ep: err.getErrors()) {
            Log.e("error",ep.getReason() + " : " + ep.getMessage() + " at " + ep.getLocation());
        }
    }
}

现在问题是我在插入数据时遇到 IO 异常,即在这一行上

 response = bigquery.tabledata().insertAll("projectNum", "Data", "CallersData", requests).execute();

我正在尝试从过去 2 天开始解决此问题。如果这里有人成功实施,请帮助我找到问题。

提前致谢。

下面是堆栈跟踪

result = {java.io.IOException@830026649024} Method threw 'java.io.IOException'  exception.
 cause = {java.io.IOException@830026649024} "java.io.IOException"
 detailMessage = null
 stackState = null
 stackTrace = {java.lang.StackTraceElement[30]@830026473856} 
 suppressedExceptions = {java.util.Collections$EmptyList@830023143656}  size = 0

【问题讨论】:

  • 异常说明了什么?
  • @Pentium10 我已经添加了堆栈跟踪..谢谢
  • 很奇怪。代码对我来说看起来不错。我什至将它复制并粘贴到我的 IDE 中(当然更改了项目 ID 等),它工作得很好,即该行已成功流式传输到 BigQuery。对不起,我被难住了。
  • @polleyg 这个错误可能是由于错误的凭据引起的。我的意思是我对我在这里输入的密钥有疑问。它会导致它..??
  • @polleyg 我们必须在清单或其他任何地方做任何事情吗?如果相同的代码在你的最后工作,那么一定有一个愚蠢的错误.. :(

标签: android google-app-engine google-bigquery google-cloud-platform


【解决方案1】:

尝试在不同的线程或异步任务中使用相同的代码。如果您仍然遇到任何问题,请告诉我。

【讨论】:

  • 我欠你一条命.. :D
  • 由于 bigquery 执行网络请求,它需要不同的线程而不是主线程来建立连接。我们不能在主线程上发出网络请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多