如何将整个pyspark数据框的大小写更改为较低或较高

新手上路,请多包涵

我正在尝试对两个数据帧中的每一行应用 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])

原文由 Jack 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 576
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)

原文由 T. Gawęda 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 Steven 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进