3.5 从 Hive 表创建
spark SQL
还支持读取和写入存储在Apache Hive
中的数据。但是由于Hive
具有大量依赖关系,因此这些依赖关系不包含在默认spark
版本中。- 如果在类路径中找到
Hive
依赖项,则Spark
将会自动加载它们 - 这些
Hive
的依赖关系也必须存在于所有工作节点上
- 如果在类路径中找到
配置:将
hive-site.xml
、core-site.html
(用于安全配置)、hdfs-site.xml
(用户HDFS
配置) 文件放在conf/
目录中完成配置。当使用
Hive
时,必须使用启用Hive
支持的SparkSession
对象(enableHiveSupport
)- 如果未部署
Hive
,则开启Hive
支持不会报错
- 如果未部署
当
hive-site.xml
未配置时,上下文会自动在当前目录中创建metastore_db
,并创建由spark.sql.warehouse.dir
指定的目录访问示例:
from pyspark.sql import SparkSession
spark_sess = SparkSession \
.builder \
.appName("Python Spark SQL Hive integration example") \
.config("spark.sql.warehouse.dir", '/home/xxx/yyy/') \
.enableHiveSupport() \
.getOrCreate()
spark_sess.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING) USING hive")
spark_sess.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")
spark.sql("SELECT * FROM src").show()
创建
Hive
表时,需要定义如何向/从文件系统读写数据,即:输入格式、输出格式。还需要定义该表的数据的序列化与反序列化。可以通过在
OPTIONS
选项中指定这些属性:spark_sess.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING) USING hive OPTIONS(fileFormat 'parquet')")
可用的选项有:
fileFormat
:文件格式。目前支持6种文件格式:'sequencefile'、'rcfile'、'orc'、'parquet'、'textfile'、'avro'
。inputFormat,outputFormat
:这两个选项将相应的InputFormat
和OutputFormat
类的名称指定为字符串文字,如'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
- 这两个选项必须成对出现
- 如果已经制定了
fileFormat
,则无法指定它们
serde
:该选项指定了serde
类的名称- 如果给定的
fileFormat
已经包含了serde
信息(如何序列化、反序列化的信息),则不要指定该选项 - 目前的
sequencefile、textfile、rcfile
不包含serde
信息,因此可以使用该选项
- 如果给定的
fieldDelim, escapeDelim, collectionDelim, mapkeyDelim, lineDelim
:这些选项只能与textfile
文件格式一起使用,它们定义了如何将分隔的文件读入行。