【问题标题】:How to change case of whole pyspark dataframe to lower or upper如何将整个pyspark数据框的大小写更改为更低或更高
【发布时间】:2018-07-11 20:55:27
【问题描述】:

我正在尝试对两个数据帧中的每一行应用 pyspark sql 函数哈希算法来识别差异。哈希算法区分大小写。即如果列包含“APPLE”和“Apple”被视为两个不同的值,所以我想将两个数据框的大小写更改为上或下。我只能实现数据帧标题,但不能实现数据帧值。请帮助

#Code for Dataframe column headers
self.df_db1 =self.df_db1.toDF(*[c.lower() for c in self.df_db1.columns])

【问题讨论】:

  • 数据或列名的大小写?

标签: python-3.x apache-spark pyspark spark-dataframe case-sensitive


【解决方案1】:

假设 df 是您的数据框,这应该可以完成工作:

from pyspark.sql import functions as F
for col in df.columns:
    df = df.withColumn(col, F.lower(F.col(col)))

【讨论】:

    【解决方案2】:

    两个答案似乎都可以,但有一个例外 - 如果您有数字列,它将被转换为字符串列。为避免这种情况,请尝试:

    import org.apache.spark.sql.types._
    import org.apache.spark.sql.functions._
    val fields = df.schema.fields
    val stringFields = df.schema.fields.filter(f => f.dataType == StringType)
    val nonStringFields = df.schema.fields.filter(f => f.dataType != StringType).map(f => f.name).map(f => col(f))
    
    val stringFieldsTransformed = stringFields .map (f => f.name).map(f => upper(col(f)).as(f))
    val df = sourceDF.select(stringFieldsTransformed ++ nonStringFields: _*)
    

    现在,当您有非字符串字段(即数字字段)时,类型也是正确的)。 如果您知道每一列都是 String 类型,请使用其他答案之一 - 在这种情况下它们是正确的 :)

    PySpark 中的 Python 代码:

    from pyspark.sql.functions import *
    from pyspark.sql.types import *
    sourceDF = spark.createDataFrame([(1, "a")], ['n', 'n1'])
     fields = sourceDF.schema.fields
    stringFields = filter(lambda f: isinstance(f.dataType, StringType), fields)
    nonStringFields = map(lambda f: col(f.name), filter(lambda f: not isinstance(f.dataType, StringType), fields))
    stringFieldsTransformed = map(lambda f: upper(col(f.name)), stringFields) 
    allFields = [*stringFieldsTransformed, *nonStringFields]
    df = sourceDF.select(allFields)
    

    【讨论】:

    • 根据OP的说法,他想从字符串列中创建一个哈希......因此,它们都应该是stringType,不需要检查类型。
    • @Steven 我们可以假设在这种情况下。这只是一个额外的答案,如果有人有类似的问题,但 DataFrame 也有数字列;)
    • 我的数据框包含所有类型的数据类型(字符串、数字、日期等)。我将使用基于哈希的匹配,因为表键信息不可用。如果可能,请在 python 中分享它。非常感谢
    • 非常感谢 T.Gaweda 帮助我解决了这个问题
    • @Jack 你说得对,改了。现在我检查了一下:)
    【解决方案3】:

    您可以使用列表推导生成表达式:

    from pyspark.sql import functions as psf
    expression = [ psf.lower(psf.col(x)).alias(x) for x in df.columns ]
    

    然后在你现有的数据框上调用它

    >>> df.show()
    +---+---+---+---+
    | c1| c2| c3| c4|
    +---+---+---+---+
    |  A|  B|  C|  D|
    +---+---+---+---+
    
    >>> df.select(*select_expression).show()
    +---+---+---+---+
    | c1| c2| c3| c4|
    +---+---+---+---+
    |  a|  b|  c|  d|
    +---+---+---+---+
    

    【讨论】:

    • psf 函数对我处理小数据集很有用,处理 4000 万条记录表是否安全?因为现在我的客户要求将所有数据设为大写。
    猜你喜欢
    • 2017-09-15
    • 2010-09-25
    • 2023-04-05
    • 1970-01-01
    • 2021-08-06
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多