使用pyspark读写hive数据表

本文介绍了在Spark 2.1.0版本下如何使用PySpark读取和写入Hive数据表。首先,展示了如何通过PySpark的SQL接口查询Hive表中的数据,包括读取HDFS上和本地的文件。接着,详细说明了两种向Hive表写入数据的方法:通过注册临时表和直接写入。最后,提到了包含这些操作的test.py脚本及其执行方式。

spark 版本 2.1.0

1、读Hive表数据

pyspark提供了操作hive的接口,可以直接使用SQL语句从hive里面查询需要的数据,代码如下:

# -*- coding: utf-8 -*-

import sys
from pyspark.sql import SparkSession, HiveContext

reload(sys)
sys.setdefaultencoding("utf-8")

#_SPARK_HOST = "spark://spark-master:7077"
_APP_NAME = "test"
spark = SparkSession.builder.enableHiveSupport().appName(_APP_NAME).getOrCreate()

# 使用拼接sql语句的方式查询hive 表,返回dataFrame格式数据
hive_database = "test"             #  要操作的数据库
hive_table = "table_01"            #  要操作的数据表
hive_read_sql = "select * from {}.{}".format(hive_database, hive_table)

read_df = spark.sql(hive_read_sql)
# hive_context = HiveContext(spark)
# hive_context.setLogLevel("WARN") # 或者INFO等
# read_df = hive_context.sql(hive_read_sql)
print(read_df.show(10))
print('*' * 10, '行为数据总量:', read_df.count(), ' 特征数量:', len(read_df.columns))
# 打印列名
print(read_df.columns)
print(read_df.printSchema())

# dataFrame 转化成rdd
rdd1 = read_df.rdd
print(rdd1.collect())
# 重复采样
data_p11 = rdd1.sample(True, samplerate, 100)  


spark.stop()

读hive表在hdfs上的文件

input_path = r"hdfs://ns1/user/hive/warehouse/zx.db/table_name" 
#  --------以orc格式存储的数据库表文件--------
read_df = spark.read.orc(input_path)
    
#  --------以textfile格式存储的数据库表文件--------
from pyspark import SparkContext,SparkConf
conf = SparkConf().setMaster("yarn").setAppName("My App")
sc = SparkContext(conf=conf)
# 直接返回rdd
rdd1 = sc.textFile(input_path)
或
spark = SparkSession.builder.config(conf=SparkConf()).getOrCreate
data = spark.read.text(input_path).cache()

读本地文件

df = spark.read.options(inferSchema=True, header=True, delimiter='\t').csv('file:///data/zz/data.csv')

2、往Hive表写数据

    使用pyspark 向hive 表写数据有两种方式 :

    2.1 dataframe 注册临时表然后写入hive

data = [
    (1,"11","111"),
    (2,"22","222"),
    (3,"33","333"),
    (4,"44","444")
]
# 创建dataframe,添加表头
# 方法1:直接创建表头
header_list = ['id', "value1", 'value2']
write_df = spark.createDataFrame(data, header_list)

# 方法2:借助StructField创建表头
# from pyspark.sql.types import *
# from pyspark.sql import Row
# schema_str = 'id,value1,value2'
# fields = [StructField(field_name, StringType(), True) for field_name in schema_str.split(',')]
# header_list = StructType(fields)
# write_df = spark.createDataFrame(rdd1,header_list)


# 将dataframe 注册成一个临时表,名字是test_hive 
write_df.registerTempTable('test_hive')

# 将数据从临时表导入目标hive表(test.table_02)
spark.sql("drop table if exists test.table_02")
spark.sql("create table test.table_02 as select * from test_hive")

   2.2 dataframe 直接写入hive

# mode("overwrite")是重写表的模式,如果表存在,就覆盖掉原始数据,如果不存在就重新生成一张表
# mode("append")是在原有表的基础上进行添加数据
# format("orc") 以orc 格式存储数据
write_df.write.format("orc").mode("overwrite").saveAsTable('test.table_02')
# 写入分区表
write_df.write.saveAsTable('zz.table_1', mode='overwrite', partitionBy=['pt'])

3. 代码汇总

test.py

# -*- coding: utf-8 -*-

import sys
from pyspark.sql import SparkSession, HiveContext

reload(sys)
sys.setdefaultencoding("utf-8")

spark = SparkSession.builder.enableHiveSupport().getOrCreate()

hive_read_sql = """
    select * 
    from test.table_01
"""   # 不要加;
read_df = spark.sql(hive_read_sql)
rdd1 = read_df.rdd

header_list = ['id', "value1", 'value2']
write_df = spark.createDataFrame(rdd1, header_list)

write_df.write.format("orc").mode("overwrite").saveAsTable('test.table_02')

spark.stop()

test.sh

#!/bin/sh
# 提交任务到Spark集群
/app/hadoop/spark/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--driver-memory 4g \
--executor-memory 4g \
--executor-cores 4 \
--num-executors 4 \
--conf spark.sql.catalogImplementation=hive \
--queue zz \
/data/zz/test.py

# 以jar包方式提交任务到Spark集群
spark-submit 
--class zz.z1 \
aa-1.0-SNAPSHOT.jar 2020-11-30

执行脚本

nohup bash -x test.sh >log.out 2>&1 &

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值