使用 Apache Spark 从 BigQuery 表读取 BIGNUMERIC 数据类型时出错

问题描述 投票:0回答:2

我有一个

Dataproc
Spark 作业,它从 Big Query 表中读取数据。 Big Query 表有一个
BIGNUMERIC
类型的列。 Spark 能够成功地从表中读取,但是当我尝试从 spark DF 中获取列名时出现问题,即在执行以下代码时

df = spark.read.format('bigquery').load('project_id.dataset_id.table_id')
columns = df.columns
print(f'*********Columns - {columns}**********')
df.show()
df.printSchema()

我得到的错误如下:

columns = df.columns() 文件 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/dataframe.py”,行 939,列文件 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/dataframe.py”,行 256、架构文件中 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py”,行 871,在 _parse_datatype_json_string 文件中 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py”,行 888,在 _parse_datatype_json_value 文件中 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py”,行 577、在fromJson文件中 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py”,行 577,在文件中 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py”,行 434,在fromJson文件中 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py”,行 890,在 _parse_datatype_json_value 文件中 “/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/types.py”,行 736, 在 fromJson ModuleNotFoundError: No module named 'google.cloud.spark'

但是,如果我省略 df.columns 并且只执行

show()
printSchema()
它工作正常。
printSchema()
的 DF 模式如下:

root
|-- col1: string (nullable = true)
|-- col2: bignumeric (nullable = true)

我已经使用

Spark - Big Query connector
从 Big Query 读取。非常感谢任何帮助和可能的解决方案。如果需要任何其他详细信息,我们很乐意提供。

apache-spark google-cloud-platform google-bigquery google-cloud-dataproc spark-bigquery-connector
2个回答
0
投票

在 spark-bigquery-connector github 中讨论了一个问题看起来与这个问题相匹配

基本上,BigNumeric 支持是通过 spark UserDefinedType 提供的,当启动您的 pyspark 作业时,需要通过命令行“--py-files”提供所需的 python 类文件

# use appropriate version for jar depending on the scala version

pyspark --jars gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.11-0.29.0.jar --py-files gs://spark-lib/bigquery/spark-bigquery-support-0.29.0.zip --文件 gs://spark-lib/bigquery/spark-bigquery-support-0.29.0.zip

或在运行时通过 spark.sparkContext.addPyFile


0
投票

如上所述,从 bigquery 读取和写入 BigNumeric 值存在多个问题。 spark-bigquery-connector 的 readme 文件中已经提到了阅读解决方案的 Alteast。

以下是链接:- https://github.com/GoogleCloudDataproc/spark-bigquery-connector#bignumeric-support

另请查找代码块解决方案。

如果代码抛出ModuleNotFoundError,请在读取BigNumeric数据前添加如下代码

try:
    import pkg_resources

    pkg_resources.declare_namespace(__name__)
except ImportError:
    import pkgutil

    __path__ = pkgutil.extend_path(__path__, __name__)

此外,请确保您已将连接器的 jar 包含在集群中(使用连接器初始化操作)或使用 --jars 选项。还要验证 gs://spark-lib/bigquery/spark-bigquery-support-0.26.0.zip 是否配置在 spark.submit.pyfiles 中或在运行时添加它

spark.sparkContext.addPyFile("gs://spark-lib/bigquery/spark-bigquery-support-0.26.0.zip")
© www.soinside.com 2019 - 2024. All rights reserved.