gpt4 book ai didi

dataframe - PySpark DataFrame 列引用 : df. col vs. df ['col' ] vs. F.col ('col')?

转载 作者:行者123 更新时间:2023-12-05 00:11:01 30 4
gpt4 key购买 nike

我有一个概念,希望你能帮助澄清:

以下三种引用 PySpark 数据框中列的方式有什么区别。我知道不同的情况需要不同的形式,但不知道为什么。

  • df.col :例如F.count(df.col)
  • df['col'] :例如df['col'] == 0
  • F.col('col') :例如df.filter(F.col('col').isNull())

  • 非常感谢!

    最佳答案

    在大多数实际应用中,几乎没有区别。但是,它们是通过调用不同的底层函数(source)来实现的,因此并不完全相同。
    我们可以用一个小例子来说明:

    df = spark.createDataFrame(
    [(1,'a', 0), (2,'b',None), (None,'c',3)],
    ['col', '2col', 'third col']
    )

    df.show()
    #+----+----+---------+
    #| col|2col|third col|
    #+----+----+---------+
    #| 1| a| 0|
    #| 2| b| null|
    #|null| c| 3|
    #+----+----+---------+

    1. df.col这是最不灵活的。您只能引用有效的列,以便使用 . 访问。运算符(operator)。这排除了包含空格或特殊字符的列名以及以整数开头的列名。
    此语法调用 df.__getattr__("col") .
    print(df.__getattr__.__doc__)
    #Returns the :class:`Column` denoted by ``name``.
    #
    # >>> df.select(df.age).collect()
    # [Row(age=2), Row(age=5)]
    #
    # .. versionadded:: 1.3
    使用 .语法,您只能访问此示例数据框的第一列。
    >>> df.2col
    File "<ipython-input-39-8e82c2dd5b7c>", line 1
    df.2col
    ^
    SyntaxError: invalid syntax
    在后台,它会检查列名是否包含在 df.columns 中。然后返回 pyspark.sql.Column指定的。
    2. df["col"]这将调用 df.__getitem__ .你有更多的灵 active ,你可以做任何 __getattr__可以,另外你可以指定任何列名。
    df["2col"]
    #Column<2col>
    再一次,在后台检查了一些条件,在这种情况下, pyspark.sql.Column返回由输入字符串指定的。
    此外,您可以传入多个列(作为 listtuple )或列表达式。
    from pyspark.sql.functions import expr
    df[['col', expr('`third col` IS NULL')]].show()
    #+----+-------------------+
    #| col|(third col IS NULL)|
    #+----+-------------------+
    #| 1| false|
    #| 2| true|
    #|null| false|
    #+----+-------------------+
    请注意,在多列的情况下, __getitem__只是调用 pyspark.sql.DataFrame.select .
    最后,您还可以按索引访问列:
    df[2]
    #Column<third col>
    3. pyspark.sql.functions.col这是 Spark 本地选择列并返回 expression 的方式。 (这是所有列函数的情况),它根据给定的名称选择列。当您需要指定需要列而不是字符串文字时,这是有用的简写。
    例如,假设我们想要创建一个新列,该列将采用 "col" 中的任一值。或 "third col"基于 "2col" 的值:
    from pyspark.sql.functions import when

    df.withColumn(
    'new',
    f.when(df['2col'].isin(['a', 'c']), 'third col').otherwise('col')
    ).show()
    #+----+----+---------+---------+
    #| col|2col|third col| new|
    #+----+----+---------+---------+
    #| 1| a| 0|third col|
    #| 2| b| null| col|
    #|null| c| 3|third col|
    #+----+----+---------+---------+
    糟糕,我不是这个意思。 Spark 认为我想要文字字符串 "col""third col" .相反,我应该写的是:
    from pyspark.sql.functions import col
    df.withColumn(
    'new',
    when(df['2col'].isin(['a', 'c']), col('third col')).otherwise(col('col'))
    ).show()
    #+----+----+---------+---+
    #| col|2col|third col|new|
    #+----+----+---------+---+
    #| 1| a| 0| 0|
    #| 2| b| null| 2|
    #|null| c| 3| 3|
    #+----+----+---------+---+
    因为 col() 在没有检查的情况下创建了列表达式,这有两个有趣的副作用。
  • 它可以重复使用,因为它不是 df 特定的
  • 可以在分配df之前使用

  • age = col('dob') / 365
    if_expr = when(age < 18, 'underage').otherwise('adult')

    df1 = df.read.csv(path).withColumn('age_category', if_expr)

    df2 = df.read.parquet(path)\
    .select('*', age.alias('age'), if_expr.alias('age_category'))
    age生成 Column<b'(dob / 365)'> if_expr生成 Column<b'CASE WHEN ((dob / 365) < 18) THEN underage ELSE adult END'>

    关于dataframe - PySpark DataFrame 列引用 : df. col vs. df ['col' ] vs. F.col ('col')?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55105363/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com