pyspark实现数据生产到parquet及hive表

该博客介绍了如何使用Python的multiprocessing库并结合PySpark来实现多线程处理不同模块的数据,分别写入Parquet文件的不同group,然后通过union整合各个group,最后将结果写入Hive表。内容涵盖了读取和写入Parquet文件、数据处理、Hive表的写入以及Parquet文件的group合并。整个流程展示了大数据处理中的数据整合和存储策略。

1. 流程概述

       针对不同模块的数据(相互独立),启用多线程分别写到parquet文件的不同group下,然后对不同group进行union整合,产出新的parquet文件,最终落地到hive。

test.py

# coding=utf-8 
import datetime 

from pyspark.sql import SparkSession 
from pyspark.sql.functions import * 
import multiprocessing
    
if __name__ == '__main__':
    spark = SparkSession \
        .builder \
        # .appName("Python Spark SQL basic example") \
        # .config("user active", "some-value") \
        .enableHiveSupport() \
        .getOrCreate()
    date = (datetime.datetime.now() + datetime.timedelta(days=-1)).strftime("%Y-%m-%d")
    # date='2021-08-09'
   
    p1 = multiprocessing.Process(target=user_click(spark, date))     
    p2 = multiprocessing.Process(target=user_life_cycle(spark, date))       
    p1.start()     
    p2.start()     

    spark.stop()     

执行  python test.py

2. 模块拆解

2.1 读parquet文件

采用parquet进行中间数据存储,parquet文件的优势在于schema在文件中,避免中间表反复修改。

注意,单引号与双引号的使用!

三引号下应用三个"\\\"来进行转义!!!

def read_parquet(spark, pt):
    # 7天前
    last_7dt = (datetime.datetime.strptime(str(pt), "%Y-%m-%d")+        datetime.timedelta(days=-(7 - 1))).strftime("%Y-%m-%d")
    df = spark.read.parquet("/user/db_dmp/db_dmp.db/lx_chat_detail/")
        .filter("pt>='{0}' and pt<='{1}'"
        .format(last_7dt, pt))
        .select("uid", "fuid", "chatHour", "pt")
        .dropDuplicates()
    df.show(2)
    # 注册临时表,进行查询
    df.createOrRe
Spark SQL可以通过以下步骤解析查询Parquet格式的Hive并获取分区字段和查询条件: 1. 首先,使用SparkSession对象创建一个DataFrame,该DataFrame将连接到Hive并读取Parquet格式的数据。 2. 接下来,使用DataFrame的schema()方法获取的模式,包括分区字段和非分区字段。 3. 使用DataFrame的filter()方法来应用查询条件,并使用where()方法来指定分区字段的值。 4. 最后,使用DataFrame的select()方法选择要返回的列,并使用show()方法显示结果。 示例代码如下: ``` from pyspark.sql import SparkSession # 创建SparkSession对象 spark = SparkSession.builder.appName("ParquetHiveTable").enableHiveSupport().getOrCreate() # 读取Hive中的Parquet数据 df = spark.table("myhive.parquet_table") # 获取的模式 schema = df.schema # 应用查询条件并指定分区字段的值 df_filtered = df.filter("column1 > 10").where("partition_column = '2022-01-01'") # 选择要返回的列并显示结果 df_filtered.select("column1", "column2").show() ``` 在上面的代码中,我们假设Parquet格式的Hive名为“myhive.parquet_table”,其中包含一个名为“column1”的非分区字段和一个名为“partition_column”的分区字段。我们使用filter()方法应用查询条件“column1 > 10”,并使用where()方法指定分区字段的值为“2022-01-01”。最后,我们选择要返回的列“column1”和“column2”,并使用show()方法显示结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值