pyspark-如何在强制转换后将列传递给函数?

xiozqbni  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(443)

我先打电话来 sha2 函数来自 pyspark.sql.functions 错误地传递了doubletype列,并出现以下错误:

cannot resolve 'sha2(`metric`, 256)' due to data type mismatch: argument 1 requires binary type, however, '`metric`' is of double type

然后我尝试首先将列强制转换为stringtype,但仍然得到相同的错误。我可能错过了一些关于spark如何处理列转换的内容。
我注意到当我打电话给 df.withColumn(col_name, F.lit(df[col_name].cast(StringType()))) 不打电话 .withColumn(col_name, F.sha2(df[col_name], 256)) 列类型更改为stringtype。
在这种情况下,我应该如何正确地应用转换?

def parse_to_sha2(df: DataFrame, cols: list):
    for col_name in cols:
        df = df.withColumn(col_name, F.lit(df[col_name].cast(StringType()))) \
               .withColumn(col_name, F.sha2(df[col_name], 256))
    return df
whitzsjs

whitzsjs1#

我认为这里的问题是对f.lit的调用,它创建了一个文本。

def parse_to_sha2(df: DataFrame, cols: list):
for col_name in cols:
    df = df.withColumn(
            col_name, 
            F.col(col_name).cast(StringType()).alias(f"{col_name}_casted")
         ).withColumn(
            col_name, 
            F.sha2(F.col(f"{col_name}_casted"), 256)
         )
return df

这将为每列生成一个sha值。
如果需要所有列,则需要将所有列传递给sha,因为它需要col*个参数。
编辑:注解的最后一位不正确,只有f.hash将多列作为参数,md5、crc、sha仅取1,很抱歉造成混淆。

brccelvz

brccelvz2#

这里不需要灯光
尝试

.withColumn(col_name, F.sha2(df[col_name].cast('string'), 256))

相关问题