火花写入拼图数组<;字符串>;在加载到BigQuery时转换为不同的数据类型 [英] Spark writing Parquet array<string> converts to a different datatype when loading into BigQuery
本文介绍了火花写入拼图数组<;字符串>;在加载到BigQuery时转换为不同的数据类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Spark数据帧架构:
StructType(
[StructField("a", StringType(), False),
StructField("b", StringType(), True),
StructField("c" , BinaryType(), False),
StructField("d", ArrayType(StringType(), False), True),
StructField("e", TimestampType(), True)
])
当我编写要拼接的数据框并将其加载到BigQuery中时,它以不同的方式解释模式。这是一个使用Spark DataFrame从JSON加载并写入PARQUE的简单操作。
BigQuery架构:
[
{
"type": "STRING",
"name": "a",
"mode": "REQUIRED"
},
{
"type": "STRING",
"name": "b",
"mode": "NULLABLE"
},
{
"type": "BYTES",
"name": "c",
"mode": "REQUIRED"
},
{
"fields": [
{
"fields": [
{
"type": "STRING",
"name": "element",
"mode": "NULLABLE"
}
],
"type": "RECORD",
"name": "list",
"mode": "REPEATED"
}
],
"type": "RECORD",
"name": "d",
"mode": "NULLABLE"
},
{
"type": "TIMESTAMP",
"name": "e",
"mode": "NULLABLE"
}
]
这是与Spark的书写方式有关,还是与BigQuery阅读拼花的方式有关。你知道我该怎么解决这个问题吗?
推荐答案
这是由于spark-bigquery connector使用的中间文件格式(默认情况下是拼接)。
连接器首先将数据写入拼图文件,然后使用BigQuery插入API将其加载到BigQuery。
如果您使用parquet-tools
检查中间镶木地板方案,您会在字段d
(ArrayType(StringType)in Spark)
optional group a (LIST) {
repeated group list {
optional binary element (STRING);
}
}
现在,如果您自己使用bq load
或BigQuery插入API在BigQuery中加载此拼图,则可以通过启用parquet_enable_list_inference
遗憾的是,在使用Spark-BigQuery连接器时,我不知道如何启用此选项!
作为一种解决办法,您可以尝试使用orc
作为中间格式。
df
.write
.format("bigquery")
.option("intermediateFormat", "orc")
这篇关于火花写入拼图数组<;字符串>;在加载到BigQuery时转换为不同的数据类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文