使用spark.sql.warehouse.dir"在同一个jupyter会话(没有数据块)工作。但是在jupyter中重新启动内核后,目录db和表不再被识别。是不是有可能有会话独立性使用元存储逻辑与三角洲湖外部的数据块(我知道使用路径的可能性)?
基督教谢谢,
spark = (
SparkSession.builder
.appName("tmp")
.config("spark.jars.packages", "io.delta:delta-core_2.12:1.0.0")
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")
.config(
"spark.sql.catalog.spark_catalog",
"org.apache.spark.sql.delta.catalog.DeltaCatalog",
)
.config("spark.sql.warehouse.dir", "/home/user/data")
.getOrCreate()
)
df = spark.range(100)
df.write.format("delta").mode("overwrite").saveAsTable("rnd")
spark.sql("Select * from rnd").show()
spark.catalog.listDatabases()
spark.catalog.listTables()
Databricks正在使用Hive metastore,如果你想拥有与Databricks相同的工作流程,设置Hive实例是你最好的选择。如果你想要/需要,你可以在本地做,我检查过了,它可以工作。
除此之外,你可以尝试使用spark。目录将这些表和数据库中的信息存储到某个文件中,然后每次启动新会话时重新加载,但我不建议这样做。
无论如何,据我所知,除了Hive之外,没有Delta集中转移。
Spark内置了metastore,默认为Derby。有一种简单的方法来定义Hive metastore数据库,它将由Spark内部管理。有了这个,你就不需要设置Hadoop和Hive了,你所需要的只是一个数据库。您可以为某些共享数据库实例配置它,或者在本地设置它。我的选择是MySQL在docker中运行,但这取决于你。下面是我用MySQL实例创建新的SparkSession的例子,但是将这个连接配置保存在spark-defaults.conf中或者更好的是保存在一些安全的位置会更有意义。
spark = SparkSession.builder.appName("metastore test")
.config("spark.hadoop.javax.jdo.option.ConnectionURL", "jdbc:mysql://localhost:3306/metadata_db")
.config("spark.hadoop.javax.jdo.option.ConnectionUserName", "user")
.config("spark.hadoop.javax.jdo.option.ConnectionPassword", "password")
.config("spark.hadoop.javax.jdo.option.ConnectionDriverName", "com.mysql.cj.jdbc.Driver")
.config("spark.sql.warehouse.dir", "/path/to/warehouse")
.enableHiveSupport().getOrCreate()
指出
只要确保你已经创建了可以从Spark访问的数据库用户,并且你有数据库的驱动程序。
我在MySQL中也缺少Hive模式,所以我从脚本手动执行模式创建,可以在这里找到:https://github.com/apache/hive/tree/master/metastore/scripts/upgrade/mysql
这是Spark的ExternalCatalog的一些上下文,我遇到https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-ExternalCatalog.html
当然你可以修改这个构建器来实现Delta支持。