Jac*_*ack 3 case-sensitive python-3.x apache-spark pyspark spark-dataframe
我正在尝试对两个数据帧中的每一行应用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])
Run Code Online (Sandbox Code Playgroud)
两个答案似乎都可以,但有一个例外 - 如果您有数字列,它将被转换为字符串列。为避免这种情况,请尝试:
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: _*)
Run Code Online (Sandbox Code Playgroud)
现在,当您有非字符串字段(即数字字段)时,类型也是正确的)。如果您知道每一列都是 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)
Run Code Online (Sandbox Code Playgroud)
假设df是您的数据框,则应完成以下工作:
from pyspark.sql import functions as F
for col in df.columns:
df = df.withColumn(col, F.lower(F.col(col)))
Run Code Online (Sandbox Code Playgroud)
您可以使用列表理解生成表达式:
from pyspark.sql import functions as psf
expression = [ psf.lower(psf.col(x)).alias(x) for x in df.columns ]
Run Code Online (Sandbox Code Playgroud)
然后只需在您现有的数据帧上调用它
>>> df.show()
+---+---+---+---+
| c1| c2| c3| c4|
+---+---+---+---+
| A| B| C| D|
+---+---+---+---+
>>> df.select(*select_expression).show()
+---+---+---+---+
| c1| c2| c3| c4|
+---+---+---+---+
| a| b| c| d|
+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5607 次 |
| 最近记录: |