我有一段测试代码,其中df包括了各种不同的数据类型:
df_csv = '''
str_col,int_col,float_col,list_col,dict_col
a,1,1.0,[1],{'a': 1}
a,1,1.0,[1],{'a': 1}
,,,,
'''
df = pd.read_csv(io.StringIO(df_csv))
convert cols to coresponding dtype
def try_eval(x):
try:
return eval(x)
except:
return x
for col in df.columns:
df[col] = df[col].apply(try_eval)
mxdf = md.read_pandas(df)
mxdf.execute()
这段代码运行会报错:
ODPSError: ODPS-0422224: RequestId: 20240702191220ea35dc0b000005ab Tag: TUNNEL Endpoint: http://dt.cn-shenzhen.maxcompute.aliyun.com
ODPS-0422224: Write data failed - The data stream you provided was not well-formed or did not validate against schema. WriteRecordBatch failed. Data invalid: ODPS-0010000:InvalidArgument:table: tmp_mf_20240702104700218gssii5gn7n1_d6ff855ad28279d80fd7e20e81827104_0, partitions: [] list is not equal to string
我知道这个可能是由于list数据类型引起的。大数据计算MaxCompute这个有解决方案吗?
pandas df转为odps表的最佳实践应该是怎样的?
根据您的描述,MaxCompute在处理Pandas DataFrame时,不支持将列表(list)转换为字符串类型。ODPS-0010000错误表明MaxCompute在尝试存储数据时遇到了无效的数据类型,特别是“list is not equal to string”。
在将Pandas DataFrame转换为MaxCompute表时,最佳实践通常包括以下步骤:
类型转换:确保Pandas DataFrame中的所有列都符合MaxCompute支持的数据类型。由于MaxCompute不支持list或dict,您需要将这些类型的数据转换为其他兼容类型,例如JSON字符串。
使用as_type参数:在创建DataFrame时,使用as_type参数明确指定转换规则。例如,将list列转换为字符串,用JSON序列化。
处理空值:确保所有列在转换时处理了缺失值,避免因空值导致的类型推断错误。
验证数据:在写入MaxCompute之前,验证DataFrame数据符合MaxCompute的Schema。
针对您的代码,可以尝试将list和dict类型数据转换为字符串(如JSON格式),然后使用as_type转换为MaxCompute支持的类型。例如:
这个原因还是因为list/map类型用来做dataframe column类型maxframe并不支持,因为兼容复杂度问题短期暂时没有支持计划,一个解法是你们把这些复杂类型先变成string,之后在apply函数中自己去把string类型转成list/map类型使用。 此回答整理自钉群“MaxFrame官方用户支持群”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。