使用 PySpark 进行数据清洗与 JSON 格式转换的实践详解(保姆级编码教程)

在大数据处理中,PySpark 提供了强大的工具来处理海量数据,特别是在数据清洗和转换方面。本文将介绍如何使用 PySpark 进行数据清洗,并将数据格式转换为 JSON 格式的实践。

简介

PySpark 是 Apache Spark 的 Python API,可用于处理大规模数据集。它提供了丰富的功能和库,使得数据清洗和转换变得更加高效和便捷。

代码实践

本文将以一个示例数据集为例,演示如何使用 PySpark 对数据进行清洗和转换。以下是代码实现的主要步骤:

步骤 1:连接到远程 Spark 服务器
# Author: 冷月半明
# Date: 2023/12/14
# Description: This script does XYZ.

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("RemoteSparkConnection") \
    .master("yarn") \
    .config("spark.pyspark.python", "/opt/apps/anaconda3/envs/myspark/bin/python") \
    .config("spark.sql.warehouse.dir", "/hive/warehouse") \
    .config("hive.metastore.uris", "thrift://node01:9083") \
    .config("spark.sql.parquet.writeLegacyFormat", "true") \
    .enableHiveSupport() \
    .getOrCreate()

当使用 PySpark 进行大数据处理时,首先需要建立与 Spark 集群的连接。在这段代码中,我们使用了 SparkSession 类来创建一个与远程 Spark 服务器的连接,并设置了连接所需的参数。

  1. 导入必要的库: 我们首先导入了 SparkSession 类,这是 PySpark 中用于管理 Spark 应用程序的入口点。

  2. 建立连接: 在接下来的代码中,我们使用 SparkSession.builder 来创建一个 SparkSession 对象。这个对象允许我们设置应用程序的名称、集群的主节点、配置项等参数。在这个例子中:

    • .appName("RemoteSparkConnection"):为我们的 Spark 应用程序设置了一个名称,这有助于在集群中识别应用程序。
    • .master("yarn"):指定 Spark 应用程序的主节点,这里使用的是 YARN 资源管理器,用于分配和管理集群资源。
    • .config("spark.pyspark.python", "/opt/apps/anaconda3/envs/myspark/bin/python"):设置了 PySpark 使用的 Python 解释器路径,确保在集群中使用正确的 Python 环境。(因为所使用的环境为anaconda创建的虚拟环境,先进入虚拟环境,然后使用which python查看解释器位置)
    • .config("spark.sql.warehouse.dir", "/hive/warehouse"):指定了 Spark SQL 的仓库目录,这对于数据存储和管理非常重要。如果不指定的话使用sparksql获取hive的时候可能会出现问题。
    • .config("hive.metastore.uris", "thrift://node01:9083"):配置 Hive 元数据存储的 URI,Hive 是 Hadoop 生态系统中的一部分,用于管理数据仓库。如果不指定的话使用sparksql获取hive的时候可能会出只能获取define默认仓库的情况。
    • .config("spark.sql.parquet.writeLegacyFormat", "true"):设置了写入 Parquet 格式数据时使用传统格式,确保兼容性和向后兼容性。因为spark写入和hive不同,使用该配置可保证spark写入hive的数据,hive能正常访问。
    • .enableHiveSupport():启用了对 Hive 的支持,允许在 Spark 中使用 Hive 的功能和特性。
    • .getOrCreate():最后使用 .getOrCreate() 方法创建或获取 SparkSession 实例。

总而言之,这段代码建立了与远程 Spark 服务器的连接,并配置了各种参数以确保应用程序能够正确地运行和访问集群资源。这是使用 PySpark 开展大数据处理工作的第一步,为后续的数据处理和分析创建了必要的环境和基础设施。

步骤 2:加载数据
df = spark.sql("SELECT * FROM cjw_data.xiecheng;")

使用 PySpark 的 spark.sql() 函数执行 SQL 查询,将查询结果加载到 DataFrame 中,为后续的数据操作和分析做好准备。这种灵活性和强大的数据处理能力是 PySpark 在大数据处理中的关键优势之一。

步骤 3:数据清洗与 JSON 格式转换

from pyspark.sql.functions import udf
import json

def json_clean(commentlist):
    try:
        jsonstr = str(commentlist)
        s = jsonstr.replace("'", '"')
        s = '[' + s.replace('}{', '},{') + ']'
        python_obj = json.loads(s, strict=False)
        json_str = json.dumps(python_obj)
        return json_str
    except:
        return None

json_clean_udf = udf(json_clean, StringType())

df = df.withColumn("new_commentlist", json_clean_udf(df["commentlist"]))
newdf = df.withColumn("commentlist", df["new_commentlist"])
newdf = newdf.drop("new_commentlist")

在 PySpark 中定义并应用一个用户自定义函数(UDF)来对数据进行清洗和转换。

  1. 定义数据清洗函数: json_clean() 函数接收一个名为 commentlist 的参数,这个函数用于将从数据库中检索到的评论数据进行清洗。具体来说:

    • jsonstr = str(commentlist):将传入的 commentlist 转换为字符串格式。
    • s = jsonstr.replace("'", '"'):将字符串中的单引号替换为双引号,以满足 JSON 格式的要求。
    • s = '[' + s.replace('}{', '},{') + ']':在字符串中的每个对象之间添加逗号,并将整个字符串包含在一个数组中,以满足 JSON 格式。
    • python_obj = json.loads(s, strict=False):将字符串解析为 Python 对象。
    • json_str = json.dumps(python_obj):将 Python 对象转换回 JSON 字符串格式。
    • return json_str:返回清洗后的 JSON 字符串,如果清洗失败则返回 None
  2. 创建用户定义函数(UDF): 使用 udf() 函数将 Python 函数 json_clean() 封装为 PySpark 的用户定义函数(UDF),以便在 Spark 中使用。

  3. 应用函数到 DataFrame: df.withColumn() 函数将定义的 UDF 应用于 DataFrame 中的 commentlist 列,并将处理后的结果存储到名为 new_commentlist 的新列中。

  4. 更新 DataFrame: 创建了一个新的 DataFrame newdf,通过在原始 DataFrame df 的基础上添加了经过清洗的 commentlist 列,并删除了原始的 new_commentlist 列。

步骤 4:保存清洗后的数据

newdf.write.mode("overwrite").saveAsTable("cjw_data.xiechengsentiment")
  1. 使用 write 方法: write 方法用于将 DataFrame 中的数据写入外部存储,可以是文件系统或数据库。
  2. 指定保存模式(Mode): 在这个例子中,.mode("overwrite") 指定了保存模式为 “overwrite”,即如果目标位置已存在同名的表或数据,将覆盖(重写)已有的内容。
  3. 保存为表(saveAsTable): saveAsTable() 方法将 DataFrame 中的数据保存为一个新的表,名为 cjw_data.xiechengsentiment。这意味着,如果该表不存在,它将会被创建;如果表已存在,根据指定的模式进行重写或追加。
步骤 5:统计数据

comment_count = newdf.filter(newdf.commentlist != "[]").count()
total_count = newdf.count()

print("有效长度:", comment_count)
print("总长度:", total_count)
  1. 筛选非空数据行: newdf.filter(newdf.commentlist != "[]") 这部分代码使用 filter() 方法筛选出 newdf DataFrame 中 commentlist 列不为空的行。这里使用的条件是 commentlist != "[]",即不等于空列表的行。也就是筛选出之前udf函数里返还为空的那些解析JSON异常的行。
  2. 统计有效数据长度: 通过 count() 方法统计筛选后的 DataFrame 中的行数,即得到了符合条件的有效数据的长度,并将结果存储在变量 comment_count 中。
  3. 统计总长度: newdf.count() 统计了整个 DataFrame 的行数,即获取了总长度,并将结果存储在变量 total_count 中。

截图示例

清洗后示意图:
image.png
hive表中查看清洗后的数据:

输出的字符串中包含了转义字符(例如 \u597d),这些字符实际上是 Unicode 字符的表示方式,而不是真正的乱码。
Python 中的 json.dumps() 方法默认将非 ASCII 字符串转换为 Unicode 转义序列。这种转义是为了确保 JSON 字符串可以被准确地传输和解析,但可能会在输出时显示为 Unicode 转义字符。

JSON 是一种数据交换格式,它使用 Unicode 转义序列(比如 \uXXXX)来表示非 ASCII 字符。在默认情况下,json.dumps() 将非 ASCII 字符转义为 Unicode 字符以确保其正确性,并且这种转义对于网络传输和解析是非常重要的

总结

本文介绍了使用 PySpark 对数据进行清洗和 JSON 格式转换的过程。通过上述步骤,我们可以连接到远程 Spark 服务器,加载数据,应用自定义函数对数据进行清洗和格式转换,并最终保存清洗后的数据。这个流程展示了 PySpark 在数据处理中的强大功能,特别是在大规模数据集的处理和转换方面的优势。如果本篇文章对您有所帮助,敬请收藏、点赞、

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用Python中的pandas库来读取Excel文件,然后将数据转换为字典格式,最后使用json库将字典转换json格式。示例代码如下: ```python import pandas as pd import json # 读取Excel文件 df = pd.read_excel('data.xlsx') # 将数据转换为字典格式 data = df.to_dict(orient='records') # 将字典转换json格式 json_data = json.dumps(data, ensure_ascii=False) print(json_data) ``` 其中,'data.xlsx'是Excel文件的路径,'ensure_ascii=False'参数可以保证中文字符不被转义为Unicode编码。 ### 回答2: 使用Python将Excel数据转换JSON格式的方法如下: 首先,需要安装openpyxl库。通过pip install openpyxl命令进行安装。 然后,导入openpyxl库,并读取Excel文件。使用load_workbook()函数加载Excel文件,然后选择要读取的工作表。 接下来,获取Excel文件中的数据使用iter_rows()函数遍历每一行数据,并将数据存储在一个列表中。 创建一个空的字典对象,并将Excel数据逐行添加到字典中。 最后,使用json库的dumps()函数将字典对象转换JSON格式,并将其保存到一个新的文件中。将文件名和保存路径作为参数传递给open()函数,并指定写入模式。 以下是一个示例代码: ```python import openpyxl import json # 读取Excel文件 workbook = openpyxl.load_workbook('data.xlsx') sheet = workbook.active data = [] # 获取Excel文件中的数据 for row in sheet.iter_rows(values_only=True): # 将每行数据存储在字典对象中 row_data = {} row_data['column1'] = row[0] # 第一列数据 row_data['column2'] = row[1] # 第二列数据 data.append(row_data) # 将数据转换JSON格式 json_data = json.dumps(data, indent=4, ensure_ascii=False) # 将JSON数据保存到文件 with open('data.json', 'w', encoding='utf-8') as file: file.write(json_data) ``` 在上述代码中,data.xlsx是包含Excel数据的文件名。通过调用openpyxl库中的load_workbook()函数,加载并打开Excel文件。然后,从工作表中的每一行数据中读取数据,并将其存储在一个列表中。接下来,通过调用json库中的dumps()函数,将数据转换JSON格式。最后,使用open()函数将JSON数据保存到一个新的文件中,文件名为data.json,文件的保存路径可以根据需要进行修改。 ### 回答3: 要使用Python将Excel数据转换JSON格式,我们可以使用第三方库pandas和xlrd来处理Excel文件。 首先,我们需要安装pandas和xlrd库。可以使用以下命令: ```python pip install pandas xlrd ``` 然后,我们可以使用pandas库中的read_excel函数来读取Excel文件,并将其转换为DataFrame对象。假设Excel文件名为data.xlsx,包含两列数据「列1」和「列2」,可以使用以下代码: ```python import pandas as pd df = pd.read_excel('data.xlsx') ``` 接下来,我们可以使用DataFrame的to_json方法将数据转换JSON格式。如果想要每个条目作为一个对象,可以指定orient参数为'records'。如果想要将每个条目作为一个列表项,可以指定orient参数为'list'。以下代码将数据转换JSON字符串并打印出来: ```python json_data = df.to_json(orient='records') print(json_data) ``` 最后,我们可以将JSON字符串写入到文件中,可以使用以下代码: ```python with open('data.json', 'w') as json_file: json_file.write(json_data) ``` 以上就是使用Python将Excel文件转换JSON格式的基本步骤。通过这种方法,我们可以方便地将Excel数据转换为能够在其他应用程序中使用JSON格式

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷月半明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值