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

被折叠的 条评论
为什么被折叠?



