我需要验证数据帧的每一列是否具有预期的长度。如果不是,则需要在数据框中添加一个新列,以填充合并验证结果。我需要使用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) ))))
答案 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的更新,如果您想检查列的行长或行中的字符长。所以我假设您想要第一个选择。
让我知道我是否错过了任何事情。