Коннектор Spark BigQuery: запись типа ARRAY вызывает исключение: недопустимое значение для: ARRAY не является допустимым значением

Запуск задания Spark в Google Cloud Dataproc. Использование коннектора BigQuery для загрузки выходных данных json из задания в таблицу BigQuery. .

В документации по типам данных Standard-SQL указано ARRAY Тип поддерживается.

Мой код 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? Или тип ARRAY не поддерживается коннектором BigQuery для Spark?


person Art Haedike    schedule 06.06.2017    source источник
comment
как обрабатывать нулевые значения с помощью Spark Bigquery Connector. есть ли другой вариант, кроме использования функций dataframe.na. Спасибо   -  person Phoenix    schedule 06.08.2019


Ответы (2)


Вместо использования type=ARRAY попробуйте установить type как обычно, но также установите ключ mode=REPEATED.

Например, массив строк может быть определен как:

{'name': 'field1', 'type': 'STRING', 'mode': 'REPEATED'}
person Willian Fuks    schedule 06.06.2017
comment
Идеально. Решено. Спасибо за блок кода копирования / вставки. - person Art Haedike; 07.06.2017
comment
как обрабатывать нулевые значения с помощью Spark Bigquery Connector. есть ли другой вариант, кроме использования функций dataframe.na. Спасибо - person Phoenix; 06.08.2019
comment
@Phoenix хм, я не уверен. Я рекомендую задать этот вопрос о SO, вы, вероятно, получите более точные ответы на этот вопрос. - person Willian Fuks; 06.08.2019
comment
С этим можно справиться, указав режим как «NULLABLE». Теперь мне действительно нужно указать как NULLABLE, так и REPEATED для режима. Я передаю то же, что и режим: [REPEATED, NULLABLE], что не кажется правильным способом. - person Phoenix; 06.08.2019

Это массивы строк? Целые числа? Я считаю, что с помощью этого API вам нужно установить type для типа элемента, например. STRING или INT64, но используйте mode из REPEATED. API-интерфейсы BigQuery еще не полностью обновлены для повсеместного использования стандартных типов SQL, поэтому вместо этого вам нужно использовать устаревшее соглашение типа + режим.

person Elliott Brossard    schedule 06.06.2017
comment
@ stackoverflow.com/users/6253347/elliott-brossard. при передаче схемы для создания таблицы с использованием строки json, как мы можем включить как NULLABLE, так и REPEATED для ключа режима. Благодарность - person Phoenix; 06.08.2019
comment
Такого варианта нет. - person Elliott Brossard; 07.08.2019