Apache Hive 是Hadoop 上的一种常见的结构化数据源,Hive 可以在HDFS 内或者其他存储系统上存储多种格式的表,这些格式从普通文本到列式存储格式,应有尽有。Spark SQL可以读取 Hive 支持的任何表。
要把 spark sql 连接到已有的 Hive 上,你需要提供hive 的配置文件,需要将hive-site.xml 文件复制到 Spark 的./conf/目录下,这样做好后,再创建HiveContext对象,也就是 Spark SQL 的入口,然后就可以使用 Hive 查询语言 HQL 对表进行查询,并以由行组成的RDD的形式拿到返回的数据。
from pyspark.sql import HiveContext
hiveCtx = HiveContext(sc)
rows = hiveCtx.sql("select name,age from ...")
firstRow = rows.first()
print firstRow.name
往Hive中插入数据,写入数据表
sql_str = "select ... from ..."
df = hiveCtx.sql(sql_str).repartition(100) #关于分区后面会介绍
sql_insert = "insert overwrite table table1 partition(pdaily = 'xxx') " + sql_str
#方法一,直接执行
hiveCtx.sql(sql_insert) #直接执行sql操作
#方法二,通过 dataframe
df.write.partitionBy("pdaily").insertInto("table1",True) #最后的参数表示是否 overwrite
Spark 对并行度的调优:
(1)第一种是在数据混洗时,使用参数的方式为混洗后的RDD指定并行度
(2)第二种方法是对于任何已有的RDD,通过 repartition(n) 将数据随机打乱并分成设定的分区数目,减少RDD分区可用coalesce(),由于coalesce没有打乱数据,因此比 repartition 更高效。