spark bigquery连接器:写入数组类型导致异常:“无效值:数组不是有效值”

k75qkfdt  于 2021-06-01  发布在  Hadoop
关注(0)|答案(2)|浏览(326)

在googleclouddataproc中运行spark作业。使用bigquery连接器将作业输出的json数据加载到bigquery表中。
bigquery标准sql数据类型文档说明支持数组类型。
我的scala代码是:

val outputDatasetId = "mydataset"
val tableSchema = "["+
    "{'name': '_id', 'type': 'STRING'},"+
    "{'name': 'array1', 'type': 'ARRAY'},"+
    "{'name': 'array2', 'type': 'ARRAY'},"+
    "{'name': 'number1', 'type': 'FLOAT'}"+
    "]"

// Output configuration
BigQueryConfiguration.configureBigQueryOutput(
    conf, projectId, outputDatasetId, "outputTable", 
    tableSchema)

//Write visits to BigQuery
jsonData.saveAsNewAPIHadoopDataset(conf)

但作业引发了以下异常:

{
  "code" : 400,
  "errors" : [ {
  "domain" : "global",
  "message" : "Invalid value for: ARRAY is not a valid value",
  "reason" : "invalid"
   } ],
  "message" : "Invalid value for: ARRAY is not a valid value"
}
    at 

com.google.cloud.hadoop.util.AbstractGoogleAsyncWriteChannel.waitForCompletionAnThrowIfUploadFailed(AbstractGoogleAsyncWriteChannel.java:432)
    at com.google.cloud.hadoop.util.AbstractGoogleAsyncWriteChannel.close(AbstractGoogleAsyncWriteChannel.java:287)
    at com.google.cloud.hadoop.io.bigquery.BigQueryRecordWriter.close(BigQueryRecordWriter.java:358)
    at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsNewAPIHadoopDataset$1$$anonfun$12$$anonfun$apply$5.apply$mcV$sp(PairRDDFunctions.scala:1124)
    at org.apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1366)
    ... 8 more
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 
400 Bad Request

这是遗留问题还是标准sql问题?或者spark的bigquery连接器不支持数组类型?

92dk7w1h

92dk7w1h1#

这些是字符串数组吗?整数?我相信使用这个api,您需要设置 type 元素类型,例如。 STRING 或者 INT64 ,但使用 modeREPEATED . bigqueryapi还没有完全更新到在任何地方都使用标准sql类型,因此您需要改用type+模式的遗留约定。

vql8enpb

vql8enpb2#

而不是使用 type=ARRAY ,尝试设置 type 就像你平时一样,但也要设置钥匙 mode=REPEATED .
例如,字符串数组将定义为:

{'name': 'field1', 'type': 'STRING', 'mode': 'REPEATED'}

相关问题