【问题标题】:How can I get the original datatype of the values after using f.coalesce in pyspark?在 pyspark 中使用 f.coalesce 后如何获取值的原始数据类型?
【发布时间】:2021-12-28 20:40:17
【问题描述】:
list = ["B", "A", "D", "C"]

data = [("B", "On","NULL",1632733508,"active"),
        ("B", "Off","NULL",1632733508, "active"), 
        ("A","On","NULL",1632733511,"active"),    
        ("A","Off","NULL",1632733512,"active"),
        ("D","NULL",450,1632733513,"inactive"),
        ("D","NULL",431,1632733515,"inactive"),
        ("C","NULL",20,1632733518,"inactive"),
        ("C","NULL",30,1632733521,"inactive")]

df = spark.createDataFrame(data, ["unique_string", "ID", "string_value", "numeric_value", "timestamp","mode"])

为了根据列表拆分 df,我有以下代码。

    split_df = (df.filter(
                f.col('listname') == list)
                .select(
                f.coalesce(f.col('string_value'), 
                f.col('double_value')).alias(list), 
                f.col('timestamp'), f.col('mode')
               ))
               return split_df


dfs = [split_df(df, list) for id in list]

起点

    ID  string_value    numeric_value   timestamp   mode   
0   B   On              NULL            1632733508  active
1   B   Off             NULL            1632733508  active
2   A   On              NULL            1632733511  active
3   A   Off             NULL            1632733512  active
4   D   NULL            450             1632733513  inactive
5   D   NULL            431             1632733515  inactive
6   C   NULL            20              1632733518  inactive
7   C   NULL            30              1632733521  inactive

使用函数 split_df 后,有一个 df 列表,如下所示。

dfs[1].show()

    D   timestamp   mode
0   450 1632733513  inactive
1   431 1632733515  inactive

使用 f.coalesce 后,每列中的所有值都将是一个字符串。对于像 ID“D”这样的数字变量,这并不好。正如 printSchema 所示,ID "D" 是一个字符串而不是双精度字符串,而 "timestamp" 也是一个字符串而不是长字符串。

dfs[1].printSchema()

root
 |-- D: string (nullable = true)
 |-- timestamp: string (nullable = true)
 |-- mode: string (nullable = true)

保留原始数据类型的函数有什么用?

【问题讨论】:

  • 如果你在做一个通用的过程,你需要一个通用的模式,其中包括一个唯一的字符串列。你不能在之后把它放回双倍吗?

标签: pyspark types casting


【解决方案1】:

您可以将其cast 设置为您想要的任何数据类型,例如

f.coalesce(
  f.col('str_col'),
  f.col('int_col'),
).cast('int')

【讨论】:

    猜你喜欢
    • 2023-02-20
    • 2018-02-18
    • 2017-12-15
    • 2015-08-26
    • 1970-01-01
    • 2015-09-05
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多