[英]Unable to read bigquery table with JSON/RECORD column type into spark dataframe. ( java.lang.IllegalStateException: Unexpected type: JSON)
我們正在嘗試從 Bigquery 中讀取一張表以激發 dataframe。
以下 pyspark 代碼用於讀取數據。
from google.oauth2 import service_account
from google.cloud import bigquery
import json
import base64 as bs
from pyspark.sql.types import StructField, StructType, StringType, IntegerType, DoubleType, DecimalType
schema = "schema_name"
project_id = "project_id"
table_name = "simple"
# table_name = "jsonres"
schema_table_name = str(project_id) + "." + str(schema) + "." + str(table_name)
credentials_dict = {"Insert_actual_credentials": "here"}
credentials = service_account.Credentials.from_service_account_info(credentials_dict)
client = bigquery.Client(credentials=credentials, project=project_id)
query = "SELECT * FROM `{}`;".format(schema_table_name)
# print(query)
query_job = client.query(query)
query_job.result()
s = json.dumps(credentials_dict)
res = bs.b64encode(s.encode('utf-8'))
ans = res.decode("utf-8")
try:
df = spark.read.format('bigquery') \
.option("credentials", ans) \
.option("parentProject", project_id) \
.option("project", project_id) \
.option("mode", "DROPMALFORMED") \
.option('dataset', query_job.destination.dataset_id) \
.load(query_job.destination.table_id)
df.printSchema()
print(df)
df.show()
except Exception as exp:
print(exp)
對於簡單的表,我們能夠成功讀取表為 dataframe。
但是當我們在下面給出的大查詢表中有 json 列時,我們就會出錯。
我們收到以下錯誤。
調用 o1138.load 時出錯。 : java.lang.IllegalStateException: Unexpected type: JSON at com.google.cloud.spark.bigquery.SchemaConverters.getStandardDataType(SchemaConverters.java:355) at com.google.cloud.spark.bigquery.SchemaConverters.lambda$getDataType$3( SchemaConverters.java:303)
我們還嘗試在讀取數據時提供模式。
structureSchema = StructType([ \
StructField('x', StructType([
StructField('name', StringType(), True)
])),
StructField("y", DecimalType(), True) \
])
print(structureSchema)
try:
df = spark.read.format('bigquery') \
.option("credentials", ans) \
.option("parentProject", project_id) \
.option("project", project_id) \
.option("mode", "DROPMALFORMED") \
.option('dataset', query_job.destination.dataset_id) \
.schema(structureSchema) \
.load(query_job.destination.table_id)
df.printSchema()
print(df)
df.show()
except Exception as exp:
print(exp)
我們仍然面臨相同的錯誤“java.lang.IllegalStateException:意外類型:JSON”。
如何將 json 類型的 bigquery 表讀入 spark dataframe?
更新 1:github 中有一個關於此的未解決問題。
在讀取 bigquery 表時,有一個來自 Apache 的 JSON 類型字段,Spark 拋出異常。
有什么解決方法嗎?
嘗試下面的代碼並檢查它是否適合您,基本上,您會將 JSON 列保留為字符串,然后您可以使用 spark function 來獲取 JSON 內容
import pyspark.sql.functions as f
structureSchema = StructType([
StructField('x', StringType()),
StructField("y", DecimalType())
])
df = (spark.read.format('bigquery')
.option("credentials", ans)
.option("parentProject", project_id)
.option("project", project_id)
.option("mode", "DROPMALFORMED")
.option('dataset', query_job.destination.dataset_id)
.schema(structureSchema)
.load(query_job.destination.table_id)
)
df = df.withColumn("jsonColumnName", f.get_json_object(f.col("x"), "$.name"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.