Spark-SQL 有用的 SQL

这篇文章是一份偏备忘录性质的 Spark-SQL 实用 SQL 记录,主要解决本地创建 Iceberg 表以及连接 Hive Metastore 时缺少现成示例的问题。正文给出了 Spark-SQL 启动 Iceberg 所需的 package 依赖写法、本地创建 Iceberg V2 表的方法,以及连接 HMS 时的相关配置,同时补充了在网络较差场景下将依赖 Jar 直接放入 Spark 目录以绕过在线下载的做法。

我发现自己每次用 Spark 造 Iceberg 表都要耗费老大的劲,官方文档总是没有一个现成的 Demo,网上也搜索不到,全靠自己琢磨。故在这里记录一下,顺带帮助一下可能需要的人。

本地 Iceberg

Spark-SQL 启动 Iceberg:

./bin/spark-sql --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.2\
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
    --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \
    --conf spark.sql.catalog.spark_catalog.type=hive \
    --conf spark.sql.catalog.local=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.local.type=hadoop \
    --conf spark.sql.catalog.local.warehouse=$PWD/warehouse \
    --conf spark.sql.defaultCatalog=local

注意 package 的名称:org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.2。其中 3.5 是 spark 的版本,要使用自己 Spark 对应的版本。2.12 是 Spark 对应的 scala 版本。1.4.2 是 iceberg 的版本。

Spark-SQL 创建一个 Iceberg V2 表:

CREATE TABLE pos_delete_parquet (id int, data string) USING iceberg 
TBLPROPERTIES(
"write.delete.mode"="merge-on-read", 
"write.update.mode"="merge-on-read", 
"write.merge.mode"="merge-on-read", 
"format-version"="2");

merge-on-read 只有 iceberg v2 才有,指定了就算是 iceberg v2 的表了。

Iceberg + HMS 连接

./bin/spark-sql \
  --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.2\
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
    --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog \
    --conf spark.sql.catalog.spark_catalog.type=hive \
    --conf spark.sql.catalog.local=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.local.type=hive \
    --conf spark.sql.defaultCatalog=local \
    --conf spark.sql.catalog.local.uri=thrift://172.26.80.92:9083

Hive + HMS 连接

# hive
./bin/spark-sql \
--conf spark.sql.hive.metastore.version=2.3.9 \
--conf spark.sql.hive.metastore.jars=builtin \
--conf spark.hadoop.hive.metastore.uris=thrift://172.26.80.92:9083 \
--driver-memory 20G \
--executor-memory 60G

解决 Spark packages 下载慢

受制于网络问题,有时候 --packages 指定的 jar 下载很慢,这时候可以直接把对应的 jar 包放置到 Spark 目录中的 jars 目录下即可。

未完待续,持续更新

原创文章,作者:Smith,如若转载,请注明出处:https://www.inlighting.org/archives/spark-sql-useful-sqls

打赏 微信扫一扫 微信扫一扫
SmithSmith
上一篇 2023年11月12日 下午7:38
下一篇 2024年3月25日 下午8:25

相关推荐

  • RLE 编码在 Apache ORC 中的实现

    这篇文章系统梳理了 Apache ORC 中 RLE 编码的两套实现,重点介绍它们如何结合 varint、zigzag 和不同的分组规则压缩整数序列。正文先从最基础的 Run Length Encoding、无符号和有符号 varint 讲起,再解释 RLE version 1 如何用 header、delta 和 varint 编码重复或等差序列,随后继续拆解 RLE version 2 中 Short Repeat、Direct、Patched Base 和 Delta 四种编码模式的结构和适用场景,并用具体数字示例说明各类 header、bit width 和数据段的含义。

    2024年6月8日
    2.2K2
  • HDFS Hedged Read 的利弊分析

    这篇文章重新审视了 HDFS Hedged Read 的实际收益与代价,重点说明它虽然能缓解慢节点问题,但会显著放大内存开销。正文先回顾 Hedged Read 在超时后向其它副本发起并行读取的工作方式,再结合线上因频繁 OOM 触发查询失败的案例,分析 HDFS 客户端在开启该功能后会额外申请一个甚至两个 ByteBuffer,导致读取同一批数据时内存占用从原本的 1 倍上升到 2 到 3 倍,最后解释了为什么 HDFS 默认关闭这一功能。

    2023年11月12日
    2.3K2
  • Apache Iceberg Delete File 解析

    这篇文章围绕 Apache Iceberg Delete File 的三种实现展开,重点梳理 Position Delete、Equality Delete 和 Deletion Vector 在文件结构、写入来源与读时匹配逻辑上的差异。正文先分别说明三类 Delete File 如何记录被删除行、它们与 Data File 的对应关系以及 DeleteFileIndex 如何基于分区、路径和 spec 组织索引,随后分析 Data File 与 Delete File 的匹配规则,以及传统 Position Delete 和 Equality Delete 在 split 并发读取场景下带来的重复加载和执行开销,最后解释了为什么 Iceberg V3 更倾向用一对一的 Deletion Vector 替代旧方案。

    2025年6月22日
    1.1K1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注


评论列表(3条)

  • danny
    danny 2024年1月27日 下午3:15

    学习到了

  • 托尼
    托尼 2023年11月30日 下午3:21

    厉害呀(☆ω☆)