Scala Spark BigQuery连接器:写入数组类型导致异常:“数组的无效值不是有效值”

Scala Spark BigQuery连接器:写入数组类型导致异常:“数组的无效值不是有效值”,scala,hadoop,apache-spark,google-bigquery,google-cloud-dataproc,Scala,Hadoop,Apache Spark,Google Bigquery,Google Cloud Dataproc,在Google Cloud Dataproc中运行Spark作业。使用将作业输出的json数据加载到BigQuery表中 BigQuery声明支持该数组类型 我的Scala代码是: val outputDatasetId = "mydataset" val tableSchema = "["+ "{'name': '_id', 'type': 'STRING'},"+ "{'name': 'array1', 'type': 'ARRAY'},"+ "{'name': 'a

在Google Cloud Dataproc中运行Spark作业。使用将作业输出的json数据加载到BigQuery表中

BigQuery声明支持该数组类型

我的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连接器不支持数组类型?

请尝试按正常方式设置类型,但也要将键模式设置为“重复”

例如,字符串数组将定义为:

{'name': 'field1', 'type': 'STRING', 'mode': 'REPEATED'}
不要使用type=ARRAY,试着像通常那样设置类型,但也要将键模式设置为REPEATED

例如,字符串数组将定义为:

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

这些是字符串数组吗?整数?我认为,使用此API时,需要将类型设置为元素类型,例如STRING或INT64,但要使用重复模式。BigQueryAPI还没有完全更新到在任何地方都使用标准SQL类型,因此您需要使用type+模式的传统约定。

这些是字符串数组吗?整数?我认为,使用此API时,需要将类型设置为元素类型,例如STRING或INT64,但要使用重复模式。BigQuery API还没有完全更新到在任何地方都使用标准SQL类型,因此您需要使用type+模式的传统约定。

Perfect。解决了的。感谢复制/粘贴代码块。如何使用spark bigquery连接器处理空值。除了使用dataframe.na函数外,还有其他选项吗。Thanks@Phoenix嗯,我不确定。我建议你继续问这个问题,这样你可能会得到更好的答案。可以通过将mode称为“NULLABLE”来处理。现在我实际上需要为mode指定NULLABLE和REPEATED。我通过的模式与模式相同:[重复,可为空]这似乎不是正确的方式。完美。解决了的。感谢复制/粘贴代码块。如何使用spark bigquery连接器处理空值。除了使用dataframe.na函数外,还有其他选项吗。Thanks@Phoenix嗯,我不确定。我建议你继续问这个问题,这样你可能会得到更好的答案。可以通过将mode称为“NULLABLE”来处理。现在我实际上需要为mode指定NULLABLE和REPEATED。我传递的模式与模式相同:[重复,可为null],这似乎不是正确的方式。如何使用spark bigquery连接器处理null值。除了使用dataframe.na函数外,还有其他选项吗。Thankshow使用spark bigquery连接器处理空值。除了使用dataframe.na函数外,还有其他选项吗。谢谢。在传递模式以使用json字符串创建表时,我们如何同时包含NULLABLE和REPEATED for mode key。谢谢,没有这样的选择。在传递模式以使用json字符串创建表时,我们如何同时包含NULLABLE和REPEATED for mode key。谢谢,没有这样的选择。