Polars搜索DataFrame时非utf8列报SchemaMisMatch错误如何解决?
问题根源
当前代码的报错来自两个问题:
- 搜索逻辑统一调用
.str.contains()方法,该方法仅能用于字符串类型的列,搜索数值、日期等非字符串列时就会抛出类型不匹配错误 - 参数解析存在拼写错误:
-f参数的dest属性写为fils_input,但main函数中读取的是arguments.files_input,会直接触发属性不存在的报错
适配多类型列的修复方案
核心思路是搜索时先把目标列转为字符串类型,再做匹配,既兼容所有数据类型,也能保留正则搜索的能力,同时补充结果去重逻辑避免重复返回同一行。
完整修改后代码
#!/usr/bin/python # Imports import polars as pl import argparse ### MAIN ### def main(): arguments = parse_arguments() dataframe = pl.read_parquet(arguments.files_input) result_df = dataframe_search(arguments, dataframe) # 可根据需求调整结果输出逻辑,比如导出到文件、打印到控制台 print(result_df) ### MISC ### def dataframe_search(arguments, dataframe) -> pl.DataFrame: dataframes = [] for column in arguments.columns: for search_val in arguments.search: # 先将列转为字符串类型再做包含匹配,兼容所有数据类型 filter_mask = pl.col(column).cast(pl.Utf8).str.contains(search_val) dataframes.append(dataframe.filter(filter_mask)) # 拼接结果并去重,避免同一行被多个条件重复匹配 return pl.concat(dataframes, how="diagonal").unique() ### ARGUMENTS ### def parse_arguments(): parser = argparse.ArgumentParser( prog='pqtmgr.py' ) # 修正参数名拼写错误 parser.add_argument( '-f', '--file-input', dest='files_input', help='Takes one filepath as input file which will be searched', required=True ) parser.add_argument( '-c', '--columns', dest='columns', help='Accepts one or multiple columns that will be searched', nargs='*', required=True ) parser.add_argument( '-s', '--search', dest='search', help='Accepts one or more strings or regular expression that are searched for in the given columns', nargs='*', required=True ) return parser.parse_args() # Execute Main if __name__ == '__main__': main()
效果验证
原来的测试命令可以正常执行:python ./pqtmgr.py -f './test.parquet' -c 'a' -s '2'
会返回a列值为2的整行数据,不会再抛出类型不匹配错误。
内容的提问来源于stack exchange,提问作者FrozenPie
相关产品推荐
相关产品推荐

