3.5 从 Hive 表创建

  1. spark SQL 还支持读取和写入存储在Apache Hive 中的数据。但是由于Hive 具有大量依赖关系,因此这些依赖关系不包含在默认spark 版本中。

    • 如果在类路径中找到Hive 依赖项,则Spark 将会自动加载它们
    • 这些Hive 的依赖关系也必须存在于所有工作节点上
  2. 配置:将hive-site.xmlcore-site.html(用于安全配置)、hdfs-site.xml(用户HDFS 配置) 文件放在conf/ 目录中完成配置。

  3. 当使用Hive 时,必须使用启用Hive 支持的SparkSession 对象(enableHiveSupport

    • 如果未部署Hive,则开启Hive 支持不会报错
  4. hive-site.xml 未配置时,上下文会自动在当前目录中创建metastore_db,并创建由spark.sql.warehouse.dir 指定的目录

  5. 访问示例:

    1. from pyspark.sql import SparkSession
    2. spark_sess = SparkSession \
    3. .builder \
    4. .appName("Python Spark SQL Hive integration example") \
    5. .config("spark.sql.warehouse.dir", '/home/xxx/yyy/') \
    6. .enableHiveSupport() \
    7. .getOrCreate()
    8. spark_sess.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING) USING hive")
    9. spark_sess.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")
    10. spark.sql("SELECT * FROM src").show()
  6. 创建Hive 表时,需要定义如何向/从文件系统读写数据,即:输入格式、输出格式。还需要定义该表的数据的序列化与反序列化。

    可以通过在OPTIONS 选项中指定这些属性:

    1. 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:这两个选项将相应的InputFormatOutputFormat 类的名称指定为字符串文字,如'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'

      • 这两个选项必须成对出现
      • 如果已经制定了fileFormat,则无法指定它们
    • serde:该选项指定了serde 类的名称

      • 如果给定的fileFormat 已经包含了serde 信息(如何序列化、反序列化的信息),则不要指定该选项
      • 目前的sequencefile、textfile、rcfile 不包含serde 信息,因此可以使用该选项
    • fieldDelim, escapeDelim, collectionDelim, mapkeyDelim, lineDelim:这些选项只能与textfile 文件格式一起使用,它们定义了如何将分隔的文件读入行。