Delta转Parquet后导入H2OFrame列分隔符不匹配如何解决
问题根因
首先明确一个基础认知:Parquet是二进制列式存储格式,本身不存在「列分隔符」的概念,你遇到的报错是H2O 3.34.0.3版本的已知问题:当导入的路径下同时存在非Parquet格式的隐藏文件/元数据文件和Parquet数据文件时,H2O会误将部分文件识别为文本格式做解析,才会触发分隔符不匹配的错误。
你从Delta转Parquet后的输出路径里大概率残留了Spark写文件时生成的隐藏文件(比如._SUCCESS、.crc校验文件、临时part文件等),H2O扫描路径时把这些小文本文件和Parquet数据文件一同尝试解析,才报了这个错。
解决方案
方案1:转Parquet时清理无用文件,统一输出格式
写Parquet时增加配置避免生成多余文件,同时保证输出文件格式统一:
delta_uri = 's3://my_bucket/path/to/delta/folder/' df = spark.read.format('delta').load(delta_uri) parquet_uri = 's3://my_bucket/path/to/parquet/folder/' # 关闭success文件、summary元数据文件生成,写入前清空目标路径避免残留旧文件 df.write \ .option("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false") \ .option("parquet.enable.summary-metadata", "false") \ .mode("overwrite") \ .parquet(parquet_uri)
如果数据量不大,可以加coalesce(1)合并为单个文件输出,进一步降低解析异常概率。
方案2:H2O导入时强制指定解析格式
不用修改转换逻辑,直接在h2o.import_file中加参数强制按Parquet格式解析,避免H2O自动识别出错:
data = h2o.import_file(path=parquet_uri, parse_type="PARQUET")
方案3:升级H2O版本
3.36及以上的H2O版本已经修复了路径扫描时自动识别格式的bug,如果集群支持版本升级,升级后原生就不会触发该错误。
内容的提问来源于stack exchange,提问作者James Adams
相关产品推荐
相关产品推荐

