首页 > 编程问答 >使用 Pyspark 比较数据帧的架构

使用 Pyspark 比较数据帧的架构

时间:2024-07-25 12:17:40浏览次数:14  
标签:python apache-spark pyspark apache-spark-sql

我有一个数据框(df)。 为了显示其架构,我使用:

from pyspark.sql.functions import *
df1.printSchema()

并且得到以下结果:

#root
# |-- name: string (nullable = true)
# |-- age: long (nullable = true)

有时架构会更改(列类型或名称):

df2.printSchema()


 #root
        # |-- name: array (nullable = true)
        # |-- gender: integer (nullable = true)
        # |-- age: long (nullable = true)

我想比较两个架构( df1 和| ||)并仅获取类型和列名称的差异(有时列可以移动到另一个位置)。 结果应该是一个表格(或数据框),如下所示: df2

   column                df1          df2     diff                       
    name:               string       array     type                             
    gender:              N/A         integer   new column 

列是相同的并且没有改变。如果省略列,将会有指示 age ) 如果每个列中有很多列,我该如何有效地做到这一点? 'omitted' ) How can I do it if efficiently if I have many columns in each?


可以使用以下代码比较两个 PySpark DataFrame 的模式并显示类型和列名称的差异:

from pyspark.sql.functions import col
from pyspark.sql.types import *

def compare_schemas(df1, df2):
    """
    比较两个数据帧的模式,并返回一个包含差异的数据帧。

    Args:
        df1: 第一个数据帧。
        df2: 第二个数据帧。

    Returns:
        一个包含差异的数据帧,列为 'column', 'df1', 'df2', 'diff'。
    """

    schema1 = df1.schema.fields
    schema2 = df2.schema.fields

    schema_dict1 = {field.name: field.dataType for field in schema1}
    schema_dict2 = {field.name: field.dataType for field in schema2}

    columns = sorted(set(schema_dict1.keys()).union(schema_dict2.keys()))

    diff_data = []
    for column in columns:
        type1 = schema_dict1.get(column)
        type2 = schema_dict2.get(column)

        if type1 != type2:
            if column not in schema_dict1:
                diff = "new column"
            elif column not in schema_dict2:
                diff = "missing column"
            else:
                diff = "type"
            diff_data.append((column, str(type1), str(type2), diff))
        else:
            # 如果需要,可以省略相同的列
            # diff_data.append((column, str(type1), str(type2), "omitted"))
            pass

    diff_df = spark.createDataFrame(diff_data, ["column", "df1", "df2", "diff"])
    return diff_df


# 示例用法
df1 = spark.createDataFrame(
    [("Alice", 30)],
    ["name", "age"]
)

df2 = spark.createDataFrame(
    [(["Bob"], "Male", 25)],
    ["name", "gender", "age"]
)

diff_df = compare_schemas(df1, df2)
diff_df.show()

这将打印:

+-------+-------+---------+-----------+
| column|    df1|      df2|       diff|
+-------+-------+---------+-----------+
|    age|LongType|  LongType|    omitted|
|  gender|    None|IntegerType|  new column|
|   name|StringType|ArrayType|       type|
+-------+-------+---------+-----------+

此代码首先从每个 DataFrame 中提取模式信息。然后,它迭代所有列,并比较它们的类型。如果发现任何差异,则会将其添加到列表中。最后,它从差异列表创建一个新的 DataFrame 并返回。

此代码应该能够有效地处理包含许多列的 DataFrame,因为它只迭代列一次。

标签:python,apache-spark,pyspark,apache-spark-sql
From: 48673247

相关文章

  • 如何使用 Python 从 Square 中的创建客户方法中检索客户 ID
    我正在square创建一个客户并得到如下结果。我需要的是获取客户的id。我的代码:fromsquare.clientimportClientclient=Client(access_token=settings.SQUARE_ACCESS_TOKEN,environment=settings.SQUARE_ENVIRONMENT,)api_customers=client.customers......
  • 为什么从.导入Python
    我使用的存储库的结构如下:在myrepo/src/中有:主要.pycore.py和somepkgsomepkg有init.py和其他python文件。somepkg不是任何文件中的类或函数。在main.py中,我看到:from.importcorefrom.importsomepkg我的问题是from和.......
  • 使用 Python 中的 Square API 检索客户 ID
    我正在为Square开发一个客户创建表单,它将创建一个客户,然后立即检索他们的ID以在程序中进一步使用。但是,我不知道如何使用API来过滤使用list_customers命令返回的数据。我找到了这篇文章:HowtoretrievecustomeridfromcreatecustomermethodinSquareusing......
  • 如何通过在字符串中使用 \u 或 \U 转义来正确表示 python3 (3.6.1+) 中的补充 unico
    最近我正在学习python,在python3中遇到了unicode转义文字的问题。似乎像Java一样,\u转义被解释为Java使用的UTF-16代码点,但问题来了:例如,如果我尝试放置3个字节的utf-8字符,例如“♬”(https://unicode-table.com/en/266C/),甚至是补充unicode字符,例如“......
  • 我的 Python 代码和 Cycle Time 小部件之间的平均周期时间不同
    我过去遇到过如何在周期时间小部件中计算平均周期时间的一些问题,因此我决定使用Python进行分析,看看是否找到任何方法来计算平均周期时间并获得相同的结果周期时间小部件中显示的值。我的问题是我无法达到周期时间小部件中显示的相同的平均周期时间值。你们能帮我解决这......
  • python3之requests库使用
    使用https://www.cnblogs.com/caroline2016/p/17007956.html建立的api测试下requests库怎么使用。模拟登录时laravelapi那边出现了 Sessionstorenotsetonrequest.错误。解决办法在app/Http/Kernel.php中api中间件组中添加两行代码:<?phpprotected$middlewareGrou......
  • 如何利用Python中的pyecharts制作—不同的柱状图
    目录专栏导读库的介绍库的安装1、柱状图(防止x轴标签名过长)2、柱状图—堆叠样式3、复合型柱状图4、柱状图—字典型总结专栏导读......
  • 六、【Python】基础教程-【Python全掌握】六大基础数据类型:浮点、布尔、列表、元组、
    ......
  • 用于获取半径内邮政编码的 Python 脚本无法正确填充 CSV
    我正在尝试编写一个Python脚本,该脚本读取包含邮政编码的CSV文件,使用API获取半径内的邮政编码,然后将结果填充到CSV中的新列中。API请求似乎工作正常,我可以在控制台输出中看到响应。但是,生成的CSV文件在radius_zips列中没有预期的值。这是我当前的脚本:......
  • 如何在Python中对轮廓图应用点画?
    我想向XarrayDataArray数据添加点画以指示重要性。该数据是经纬度网格上的二维气候数据。我想提供一个True/False掩码来绘制映射的变量数据。我正在尝试使用contourf来达到此目的,但如果它们更合适,我愿意接受其他方法。我尝试过使用contourf孵化点画重要区域,但......