繁体   English   中英

对于字典中的每个键/值对,检查值是否为 pyspark Dataframe 类型

[英]For each key/value pair in a dictionary, check if the value is of type pyspark Dataframe

我有一个 dataframe 和一个字典列表如下 -

    x=spark.createDataFrame(["10","11","13"], "string").toDF("age")
    results = [
         {'type': 'check_datatype',
          'kwargs': {'table': x, 'columns': ['car_id','index'], 'd_type': 'str'},
          'datasource_path': '/cars_dataset_ok/',
          'Result': False},
        {'type': 'check_string_consistency',
          'kwargs': {'table': 'cars', 'columns': x, 'string_length': 6},
          'datasource_path': '/cars_dataset_ok/',
          'Result': False}
        ]

我想实现两件事-

1.
For each key/value pair in kwargs key, check if any value for all keys is of type pyspark Dataframe. If so, replace the value by the string "invalid dataframe"

2. For each key/value pair in kwargs key, check if value in 'table' key is of type pyspark Dataframe. If so, replace the value by the string "invalid dataframe"

预计 Output -

  1. 替换所有键的 dataframe 值

最终结果1 =

[
             {'type': 'check_datatype',
              'kwargs': {'table': "invalid dataframe", 'columns': ['car_id','index'], 'd_type': 'str'},
              'datasource_path': '/cars_dataset_ok/',
              'Result': False},
            {'type': 'check_string_consistency',
              'kwargs': {'table': 'cars', 'columns': "invalid dataframe", 'string_length': 6},
              'datasource_path': '/cars_dataset_ok/',
              'Result': False}
            ]
  1. 替换 dataframe,只要 kwargs 中的键是 'table'

最终结果2=

    [
             {'type': 'check_datatype',
              'kwargs': {'table': "invalid dataframe", 'columns': ['car_id','index'], 'd_type': 'str'},
              'datasource_path': '/cars_dataset_ok/',
              'Result': False},
            {'type': 'check_string_consistency',
              'kwargs': {'table': 'cars', 'columns': x, 'string_length': 6},
              'datasource_path': '/cars_dataset_ok/',
              'Result': False}
            ]

您可以使用一些列表/字典理解:

from pyspark.sql import DataFrame

result1 = [
    {
        k: v 
        if k != 'kwargs' 
        else {
            k2: "invalid dataframe" 
            if isinstance(v2, DataFrame) 
            else v2 
            for (k2, v2) in v.items()
        } 
        for (k, v) in d.items()
    } for d in results
]

print(result1)
# [{'type': 'check_datatype', 'kwargs': {'table': 'invalid dataframe', 'columns': ['car_id', 'index'], 'd_type': 'str'}, 'datasource_path': '/cars_dataset_ok/', 'Result': False}, {'type': 'check_string_consistency', 'kwargs': {'table': 'cars', 'columns': 'invalid dataframe', 'string_length': 6}, 'datasource_path': '/cars_dataset_ok/', 'Result': False}]

result2 = [
    {
        k: v 
        if k != 'kwargs' 
        else {
            k2: "invalid dataframe" 
            if k2 == 'table' and isinstance(v2, DataFrame) 
            else v2 
            for (k2, v2) in v.items()
        } 
        for (k, v) in d.items()
    } 
    for d in results
]

print(result2)
# [{'type': 'check_datatype', 'kwargs': {'table': 'invalid dataframe', 'columns': ['car_id', 'index'], 'd_type': 'str'}, 'datasource_path': '/cars_dataset_ok/', 'Result': False}, {'type': 'check_string_consistency', 'kwargs': {'table': 'cars', 'columns': DataFrame[age: string], 'string_length': 6}, 'datasource_path': '/cars_dataset_ok/', 'Result': False}]

请注意, x在打印时将显示为DataFrame[age: string] 应该还是原来的dataframe。

您可以使用isinstance(variable,class)来检查变量是否属于某种类型。 The PySpark docs says that the DataFrames belong to the class pyspark.sql.DataFrame

所以我们需要做的就是循环并使用isinstance

对于案例 1,首先创建新字典的深层副本

import copy

finalresult1 = copy.deepcopy(result)
for dic in finalresult1:
    for k,v in dic:
        if (isinstance(v,pyspark.sql.DataFrame)):
            dic[k] = "invalid dataframe"
        

对于案例 2,我们只需要检查表

    finalresult2 = copy.deepcopy(result)
    for dic in finalresult2:
        if (isinstance(dic['table'],pyspark.sql.DataFrame)):
            dic[k] = "invalid dataframe"

如果这引发错误,您可以使用type(x)为 DataFrame 找到正确的 class

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM