PySpark-在DataFrame中添加新列

时间:2019-02-25 05:33:06

标签: python apache-spark pyspark pyspark-sql

我需要验证数据帧的每一列是否具有预期的长度。如果不是,则需要在数据框中添加一个新列,以填充合并验证结果。我需要使用python编写。

例如,下面是我的数据帧结构。我的验证标准是任何列的总长度不得超过3。

[col1   col2    col3
=========================
AAA     BBB     CCC
DDDD    EEE     BBBB
AAA     EEEE    BBBB

我期望输出如下。

col1    col2    col3                   length_check
======================================================================================
AAA     BBB     CCC      
DDDD    EEE     BBBB     Expected Length of col1 is 3; Expected Length of col3 is 3
AAA     EEEE    BBBB     Expected Length of col2 is 3; Expected Length of col3 is 3

非常感谢您的投入。谢谢

代码:

valid_rdd=parsed_file.map(lambda line: line if len(line)==4 else False)
                     .filter(lambda line:line!=False)
invalid_rdd=parsed_file.map(lambda line: line if len(line)!=4 else False)
                       .filter(lambda line:line!=False) 
columns=['colA','colB','colC','colD'] 
df_valid=valid_rdd.toDF(columns) 
df1=df_valid.withColumn('length_check', (f.when (f.length('colA')== 1, "True").otherwise("Expected Column length 1 but found "+ str(f.length('colA') + str(df_valid.colA) ))))

1 个答案:

答案 0 :(得分:0)

首先,我对PySpark的经验不是很丰富,对Python的了解也很少,但是我能够复制您的代码(只需进行一些重构)。

在向您展示代码之前,我认为必须提及以下代码是基于this article的尝试复制真实场景的代码(我假设您将设法获取所有必要的数据,可以。)

# Assuming this is the returned value from the Data Frame (e.g.parsed_file.columns)
DATA_FRAME_COLUMNS = [
    'Col1',
    'Col2',
    'Col3',
]


def get_rows_from_a_column(column):
     # This dictionary is actually a mock of what should be something like parsed_file.select(column).rows
     return {
         'Col1': ['AAA', 'BBB', 'CCC'],
         'Col2': ['DDDD', 'EEE', 'BBBB'],
         'Col3': ['AAA', 'EEEE', 'BBBB']
     }[column]


def check_column_length(data_frame_columns):
    """
    This function checks for the length of rows that you have accordingly to 
    DATA_FRAME_COLUMNS
    """
    data = {}

    for column in data_frame_columns:
        column_rows = get_rows_from_a_column(column)

        if len(column_rows) != 3:
            raise ValueError('Expected length of ' + column + ' to be 3')

        data[column] = column_rows

    return data


print(check_column_length(DATA_FRAME_COLUMNS)) # {'Col2': ['DDDD', 'EEE', 'BBBB'], 'Col3': ['AAA', 'EEEE', 'BBBB'], 'Col1': ['AAA', 'BBB', 'CCC']}

如果我的建议有价值,我建议您看一下Zen of Python,但我不知道您的语言水平(但是我想您还是会听说的)

我为什么要这样说?我认为lambda函数在某些情况下是好的,但是它们通常违反Explicit is better than implicit.原则。

这些东西与您的整体代码有关,包括方式,外观和理解方式。我个人会避免使用它(但这取决于情况)。

PS:我不确定直到这篇文章上@barbsan的更新,如果您想检查列的行长或行中的字符长。所以我假设您想要第一个选择。

让我知道我是否错过了任何事情。