Spark SQL----Hive表


Spark SQL还支持读取和写入存储在Apache Hive中的数据。然而,由于Hive有大量的依赖项,这些依赖项不包括在默认的Spark发布版中。如果在类路径上可以找到Hive依赖项,Spark将自动加载它们。请注意,这些Hive依赖项也必须存在于所有工作节点上,因为它们需要访问Hive序列化和反序列化库(SerDes)才能访问存储在Hive中的数据。
Hive的配置是通过将hive-site.xml, core-site.xml(用于安全配置)和hdfs-site.xml(用于HDFS配置)文件放在conf/中来完成的。
使用Hive时,必须实例化具有Hive支持的SparkSession,包括到持久Hive metastore的连接、对Hive serdes的支持以及Hive用户定义的函数(UDF)。没有现成Hive部署的用户仍然可以启用Hive支持。当hive-site.xml未配置时,上下文会自动在当前目录中创建metastore_db,并创建由spark.sql.warehouse.dir配置的目录,默认为spark应用程序启动的当前目录中的目录spark-warehouse。请注意,自Spark 2.0.0以来,hive-site.xml中的hive.metastore.warehouse.dir属性已被弃用。相反,使用spark.sql.warehouse.dir来指定数据库在仓库中的默认位置。你可能需要将写入权限授予启动Spark应用程序的用户。

from os.path import abspath

from pyspark.sql import SparkSession
from pyspark.sql import Row

# warehouse_location points to the default location for managed databases and tables
warehouse_location = abspath('spark-warehouse')

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL Hive integration example") \
    .config("spark.sql.warehouse.dir", warehouse_location) \
    .enableHiveSupport() \
    .getOrCreate()

# spark is an existing SparkSession
spark.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING) USING hive")
spark.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")

# Queries are expressed in HiveQL
spark.sql("SELECT * FROM src").show()
# +---+-------+
# |key|  value|
# +---+-------+
# |238|val_238|
# | 86| val_86|
# |311|val_311|
# ...

# Aggregation queries are also supported.
spark.sql("SELECT COUNT(*) FROM src").show()
# +--------+
# |count(1)|
# +--------+
# |    500 |
# +--------+

# The results of SQL queries are themselves DataFrames and support all normal functions.
sqlDF = spark.sql("SELECT key, value FROM src WHERE key < 10 ORDER BY key")

# The items in DataFrames are of type Row, which allows you to access each column by ordinal.
stringsDS = sqlDF.rdd.map(lambda row: "Key: %d, Value: %s" % (row.key, row.value))
for record in stringsDS.collect():
    print(record)
# Key: 0, Value: val_0
# Key: 0, Value: val_0
# Key: 0, Value: val_0
# ...

# You can also use DataFrames to create temporary views within a SparkSession.
Record = Row("key", "value")
recordsDF = spark.createDataFrame([Record(i, "val_" + str(i)) for i in range(1, 101)])
recordsDF.createOrReplaceTempView("records")

# Queries can then join DataFrame data with data stored in Hive.
spark.sql("SELECT * FROM records r JOIN src s ON r.key = s.key").show()
# +---+------+---+------+
# |key| value|key| value|
# +---+------+---+------+
# |  2| val_2|  2| val_2|
# |  4| val_4|  4| val_4|
# |  5| val_5|  5| val_5|
# ...

Spark repo中的“examples/src/main/python/sql/hive.py”中找到完整的示例代码。

一、指定Hive表的存储格式

创建Hive表时,需要定义该表应如何从文件系统读取数据/向文件系统写入数据,即“输入格式”和“输出格式”。你还需要定义此表应如何将数据反序列化为行,或将行序列化为数据,即“serde”。以下选项可用于指定存储格式(“serde”、“input format”、“output format”),例如CREATE TABLE src(id int) USING hive OPTIONS(fileFormat ‘parquet’)。默认情况下,我们将以纯文本形式读取表文件。请注意,创建表时还不支持Hive存储处理程序,你可以使用Hive端的存储处理程序创建表,并使用Spark SQL读取它。

Property NameMeaning
fileFormatfileFormat是一种存储格式规范包,包括“serde”、“input format”和“output format”。目前我们支持6种文件格式:‘sequencefile’, ‘rcfile’, ‘orc’, ‘parquet’, ‘textfile’和’avro’。
inputFormat, outputFormat这两个选项以字符串文字的形式指定相应的InputFormat和OutputFormat类的名称,例如org.apache.hadoop.hive.ql.io.orc.OrcInputFormat。这两个选项必须成对出现,如果已经指定了fileFormat选项,则不能指定它们。
serde此选项指定serde类的名称。当指定fileFormat选项时,如果给定的fileFormat已经包含了serde的信息,则不要指定该选项。目前“sequencefile”,“textfile”和“rcfile”不包括serde信息,你可以在这3种文件格式中使用这个选项。
fieldDelim, escapeDelim, collectionDelim, mapkeyDelim, lineDelim这些选项只能与"textfile" fileFormat一起使用。它们定义了如何将分隔的文件读入行。

所有其他用OPTIONS定义的属性将被视为Hive serde属性。

二、与不同版本的Hive Metastore交互

Spark SQL的Hive支持中最重要的部分之一是与Hive metastore的交互,它使Spark SQL能够访问Hive表的元数据。从Spark 1.4.0开始,使用下面描述的配置,可以使用Spark SQL的单个二进制构建来查询不同版本的Hive metastores。请注意,与用于与metastore对话的Hive版本无关,Spark SQL内部将根据内置Hive进行编译,并使用这些类进行内部执行(serdes、UDFs、UDAFs等)。
以下选项可用于配置用于检索元数据的Hive版本:

Property NameDefaultMeaningSince Version
spark.sql.hive.metastore.version2.3.9Hive metastore的版本。可用的选项是0.12.0到2.3.9和3.0.0到3.1.3。1.4.0
spark.sql.hive.metastore.jarsbuiltin应该用于实例化HiveMetastoreClient的jar的位置。此属性可以是以下四个选项之一: 1. builtin: 使用Hive 2.3.9,当启用-Phive时,它与Spark程序集捆绑在一起。选择此选项时,spark.sql.hive.metastore.version必须为2.3.9或未定义。 2. maven: 使用从Maven存储库下载的指定版本的Hive jar。通常不建议将此配置用于生产部署。 3. path:使用spark.sql.hive.metastore.jars.path配置的Hive jar,格式以逗号分隔。支持本地或远程路径。所提供的jar应该与spark.sql.hive.metastore.version版本相同。 4. JVM标准格式的类路径。这个类路径必须包含所有Hive及其依赖,包括Hadoop的正确版本。所提供的jar应该与spark.sql.hive.metastore.version版本相同。这些jar只需要存在于driver中,但如果你在yarn集群模式下运行,则必须确保它们与应用程序打包在一起。1.4.0
spark.sql.hive.metastore.jars.path(empty)用于实例化HiveMetastoreClient的jar的逗号分隔路径。只有当spark.sql.hive.metastore.jars被设置为path时,这个配置才有用。路径可以是以下任意格式: 1. file://path/to/jar/foo.jar 2. hdfs://nameservice/path/to/jar/foo.jar 3. /path/to/jar/(没有URI scheme的路径遵循conf fs.defaultFS的URI schema) 4. [http/https/ftp]: //path/to/jar/foo.jar 注意,1、2和3支持通配符。例如: 1. file://path/to/jar/*,file://path2/to/jar/*/*.jar 2. hdfs://nameservice/path/to/jar/*,hdfs://nameservice2/path/to/jar/*/*.jar3.1.0
spark.sql.hive.metastore.sharedPrefixescom.mysql.jdbc, org.postgresql, com.microsoft.sqlserver, oracle.jdbc一个逗号分隔的类前缀列表,应该使用Spark SQL和特定版本的Hive之间共享的类加载器加载。应该共享的类的一个示例是与metastore通信所需的JDBC驱动程序。其他需要共享的类是那些与已经共享的类交互的类。例如,log4j使用的自定义appender。1.4.0
spark.sql.hive.metastore.barrierPrefixes(empty)以逗号分隔的类前缀列表,应为Spark SQL正在通信的每个版本的Hive显式重新加载这些前缀。例如,在通常会共享的前缀中声明的Hive UDF(例如,org.apache.spark.*)。1.4.0
  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark是一个开源的大数据处理框架,可以处理大规模的数据集。而Spark SQLSpark中的一个模块,用于处理结构化数据,支持SQL查询和DataFrame API。Spark SQL可以将结构化数据存储在分布式的列式存储系统中,并提供了高效的查询引擎,可以在大规模数据集上进行快速的查询和分析。Spark SQL还支持多种数据源,包括Hive、JSON、Parquet等。 ### 回答2: Spark是一个开源的大数据处理工具,它主要的特点是速度快、易于扩展和支持多种语言。Spark可以用于批处理、实时处理、机器学习、图处理、流处理等多个领域,并且可以在大多数基础设施上运行,如Hadoop、Mesos、Kubernetes等,为企业提供了更加便利灵活的大数据处理方案。 Spark SQLSpark中的一个模块,它提供了一个基于SQL的接口以及齐全的支持,让用户可以方便地在Spark上进行结构化数据处理,如数据查询、聚合、过滤等。Spark SQL的优势在于其性能优异,它可以在不同的数据源上运行,包括Hive、Avro、Parquet等。 Spark SQL模块的核心组件为Catalyst,它是一个基于规则的优化器,可以自动优化查询计划,提高整体查询速度。Spark SQL支持多种查询API,包括SQL、DataFrame API和DataSet API,用户可以根据自己的需求选择不同的API来处理数据。 另外,Spark SQL支持数据格式的灵活转换,可以将不同数据源中的数据转换为DataFrame或DataSet格式,并且提供了丰富的数据源集成插件,如JDBC、MongoDB、Cassandra等。 总之,Spark以其快速、灵活、易于扩展的特性帮助企业更好地管理和处理大规模结构化数据,而Spark SQL则是Spark的重要组成部分,它提供SQL接口和优化器,让用户可以更加方便地处理和分析结构化数据。 ### 回答3: Spark是一个开源分布式数据处理框架,可以快速处理大规模数据集,支持多种数据源和数据处理方式,具有高效的计算能力和可扩展性。Spark SQLSpark中的一个子项目,提供了一种基于SQL的接口,可以将结构化数据集集成到Spark中,支持SQL查询、数据聚合、连接和过滤等操作。Spark SQL支持多种数据源,包括Hive、JSON、Parquet和CSV格式等,同时也支持DataFrame和Dataset等高级数据结构。Spark SQL还提供了Java、Scala和Python等多种编程语言接口,以便各种开发人员利用Spark SQL进行数据处理和分析。 Spark SQL的一个重要特性是DataFrame,它是一个分布式的数据集合,类似于关系型数据库中的格,但是可以横向扩展到大规模数据集。DataFrame提供了Schema(数据结构)的定义和数据类型的推导,可以简化代码编写和数据处理过程。在Spark SQL中,DataFrame可以通过API进行操作,也可以通过SQL查询进行操作。Spark SQL还支持多种数据格式之间的转换,例如从JSON格式转换为Parquet格式,从CSV格式转换为Hive格等。 Spark SQL的一个优势是可以与其他Spark组件集成,例如Spark Streaming、MLlib和GraphX等,使得数据处理和分析更加高效和简洁。Spark Streaming可以将实时数据处理与批处理数据处理相结合,使得数据处理和分析更加完整和有力。MLlib提供了机器学习算法的实现,可以快速进行数据挖掘和模型训练。GraphX提供了图形计算的能力,可以进行大规模的网络分析和数据可视化。 总之,Spark SQL是一个强大的数据处理框架,可以快速处理各种结构化数据集,并且可以与其他组件集成,实现高效的数据分析和挖掘。随着大数据时代的到来,Spark SQL将成为数据科学和工程师的必备工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值