Spark SQL报错ICEBERG不是有效数据源问题求助
解决Spark查询Iceberg表时"ICEBERG is not a valid Spark SQL Data Source"报错
问题根源
你创建的classicmodels数据库和orders表未关联到配置的Iceberg catalog,而是存储在Spark默认catalog中。默认catalog不支持ICEBERG数据源类型,因此触发查询报错。
修复步骤
1. 显式使用Iceberg catalog创建库表
修改建库、建表语句,指定使用你配置的icebergcatalog:
# 创建关联Iceberg catalog的数据库 spark.sql("CREATE DATABASE IF NOT EXISTS icebergcatalog.classicmodels;") # 切换到该数据库 spark.sql("USE icebergcatalog.classicmodels;") # 创建Iceberg表(修正TBLPROPERTIES参数写法) spark.sql(""" CREATE TABLE orders ( orderNumber bigint COMMENT 'unique id', orderDate timestamp, requiredDate timestamp, shippedDate timestamp, status string, comments string, customerNumber bigint) USING ICEBERG TBLPROPERTIES ( 'format-version'='2' ); """) # 查询表(需指定Iceberg catalog) spark.sql("select * from icebergcatalog.classicmodels.orders ;").show()
注意:原建表语句中option.format-version是错误写法,应改为format-version
2. 将Iceberg catalog设为默认catalog(可选)
若不想每次操作都指定catalog,可在SparkSession配置中替换默认的spark_catalog为Iceberg catalog:
spark = SparkSession.builder.appName("MySQLRead") \ .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \ .config("spark.sql.catalog.icebergcatalog", "org.apache.iceberg.spark.SparkCatalog") \ .config("spark.sql.catalog.icebergcatalog.type", "hadoop") \ # 替换默认catalog为Iceberg的Hadoop catalog .config("spark.sql.catalog.spark_catalog", "org.apache.iceberg.spark.SparkCatalog") \ .config("spark.sql.catalog.spark_catalog.type", "hadoop") \ .getOrCreate()
配置完成后,直接创建库表即可正常使用:
spark.sql("CREATE DATABASE IF NOT EXISTS classicmodels;") spark.sql("USE classicmodels;") # 建表和查询语句无需修改即可运行
3. 验证Iceberg依赖完整性
确保Spark运行时能加载到对应版本的Iceberg Java依赖包。若通过pyiceberg安装,需确认其已正确传递依赖给Spark;也可手动将Iceberg Spark runtime jar包(如iceberg-spark-runtime-3.3_2.12.jar,需匹配你的Spark版本)添加到Spark的classpath中。
内容的提问来源于stack exchange,提问作者henryangminh
相关产品推荐
相关产品推荐

