我正在尝试使用 pandas、hdf5 构建一个 ETL 工具包。
我的计划是
- 从mysql中提取表到DataFrame;
- 将此DataFrame放入HDFStore;
但是当我执行第 2 步时,我发现将数据框放入 *.h5 文件会花费太多时间。
- 源mysql服务器表大小:498MB
- 将数据框放入后*.h5文件的大小:513MB
我的问题是:
这个时间成本正常吗?
有什么办法让它更快?
更新 1
谢谢杰夫
tables.exceptions.HDF5ExtError: HDF5 错误回溯
文件“../../../src/H5F.c”,第 1512 行,在 H5Fopen
无法在 H5F_open 中打开文件“../../../src/H5F.c”,第 1307 行
无法读取 H5F_super_read 中的超级块文件“../../../src/H5Fsuper.c”,第 305 行
无法在 H5F_locate_signature 中找到文件签名文件“../../../src/H5Fsuper.c”,第 153 行
找不到有效的文件签名
HDF5 错误回溯结束
无法打开/创建文件“extract_store.h5”
- 其他一些信息:
- 熊猫版本:'0.10.0'
- 操作系统:ubuntu 服务器 10.04 x86_64
- cpu: 8 * Intel(R) Xeon(R) CPU X5670 @ 2.93GHz
- MemTotal:51634016 kB
我会将 pandas 更新到 0.10.1-dev 并重试。
更新 2
- 我已将 pandas 更新为 '0.10.1.dev-6e2b6ea'
- 但时间成本并没有降低,这次花费了 884.15 s 秒
- “ptdump -av file.h5”的输出是:
/(根组)''
/._v_attrs (AttributeSet),4个属性:
[类:='组',
PYTABLES_FORMAT_VERSION := '2.0',
标题:='',
版本:='1.0']
/df_bugs (组) ''
/df_bugs._v_attrs(属性集),12个属性:
[类:='组',
标题:='',
版本 := '1.0',
axis0_variety := '常规',
axis1_variety := '常规',
block0_items_variety := '常规',
block1_items_variety := '常规',
block2_items_variety := '常规',
nblocks := 3,
ndim := 2,
pandas_type := '框架',
pandas_version := '0.10.1']
/df_bugs/axis0 (Array(52,)) ''
atom := StringAtom(itemsize=19, shape=(), dflt='')
主调:= 0
味道 := 'numpy'
byteorder := '无关'
块状 := 无
/df_bugs/axis0._v_attrs(属性集),7个属性:
[类:='阵列',
风味 := 'numpy',
标题:='',
版本 := '2.3',
种类 := '字符串',
名称 := 无,
转置:=真]
/df_bugs/axis1(数组(924624,))''
atom := Int64Atom(shape=(), dflt=0)
主调:= 0
味道 := 'numpy'
字节序 := '小'
块状 := 无
/df_bugs/axis1._v_attrs(属性集),7个属性:
[类:='阵列',
风味 := 'numpy',
标题:='',
版本 := '2.3',
种类 := '整数',
名称 := 无,
转置:=真]
/df_bugs/block0_items (Array(5,)) ''
atom := StringAtom(itemsize=12, shape=(), dflt='')
主调:= 0
味道 := 'numpy'
byteorder := '无关'
块状 := 无
/df_bugs/block0_items._v_attrs(属性集),7个属性:
[类:='阵列',
风味 := 'numpy',
标题:='',
版本 := '2.3',
种类 := '字符串',
名称 := 无,
转置:=真]
/df_bugs/block0_values (Array(924624, 5)) ''
atom := Float64Atom(shape=(), dflt=0.0)
主调:= 0
味道 := 'numpy'
字节序 := '小'
块状 := 无
/df_bugs/block0_values._v_attrs(属性集),5个属性:
[类:='阵列',
风味 := 'numpy',
标题:='',
版本 := '2.3',
转置:=真]
/df_bugs/block1_items (Array(19,)) ''
atom := StringAtom(itemsize=19, shape=(), dflt='')
主调:= 0
味道 := 'numpy'
byteorder := '无关'
块状 := 无
/df_bugs/block1_items._v_attrs(属性集),7个属性:
[类:='阵列',
风味 := 'numpy',
标题:='',
版本 := '2.3',
种类 := '字符串',
名称 := 无,
转置:=真]
/df_bugs/block1_values (Array(924624, 19)) ''
atom := Int64Atom(shape=(), dflt=0)
主调:= 0
味道 := 'numpy'
字节序 := '小'
块状 := 无
/df_bugs/block1_values._v_attrs(属性集),5个属性:
[类:='阵列',
风味 := 'numpy',
标题:='',
版本 := '2.3',
转置:=真]
/df_bugs/block2_items (Array(28,)) ''
atom := StringAtom(itemsize=18, shape=(), dflt='')
主调:= 0
味道 := 'numpy'
byteorder := '无关'
块状 := 无
/df_bugs/block2_items._v_attrs(属性集),7个属性:
[类:='阵列',
风味 := 'numpy',
标题:='',
版本 := '2.3',
种类 := '字符串',
名称 := 无,
转置:=真]
/df_bugs/block2_values (VLArray(1,)) ''
原子 = 对象原子()
byteorder = '无关'
nrows = 1
风味='numpy'
/df_bugs/block2_values._v_attrs(属性集),5个属性:
[类:='VLARRAY',
伪原子 := '对象',
标题:='',
版本:='1.3',
转置:=真]
- 我在下面尝试了您的代码(将数据帧放入 hdfstore 中,参数 'table' 为 True),但出现错误,似乎不支持 python 的数据时间类型:
异常:找不到正确的原子类型 -> [dtype->object] 对象
'datetime.datetime' 类型的没有 len()
更新 3
感谢杰夫。
抱歉耽搁了。
- 表格。版本:'2.4.0'。
- 是的,884 秒只是 put 操作的成本,没有来自 mysql 的 pull 操作
- 一行数据框(df.ix[0]):
bug_id 1
分配给 185
bug_file_loc 无
bug_severity 严重
bug_status 关闭
创建_ts 1998-05-06 21:27:00
delta_ts 2012-05-09 14:41:41
short_desc 两个游标。
host_op_sys 未知
guest_op_sys 未知
优先级 P3
rep_platform IA32
记者56
product_id 7
类别 ID 983
组件 ID 12925
分辨率固定
目标里程碑ws1
qa_contact 412
status_whiteboard
票数 0
关键词 SR
上次差异 2012-05-09 14:41:41
曾经确认过 1
记者可访问 1
cclist_accessible 1
估计时间 0.00
剩余时间 0.00
截止日期 无
别名 无
found_in_product_id 0
found_in_version_id 0
found_in_phase_id 0
cf_type 缺陷
cf_reported_by 开发
cf_attempted NaN
cf_failed NaN
cf_public_summary
cf_doc_impact 0
cf_security 0
cf_build NaN
cf_branch
cf_change NaN
cf_test_id NaN
cf_regression 未知
cf_reviewer 0
cf_on_hold 0
cf_public_severity ---
cf_i18n_impact 0
cf_eta 无
cf_bug_source ---
cf_viss 无
名称:0,长度:52
- dataframe的图片(在ipython notebook中输入'df'即可):
Int64Index:924624 个条目,0 到 924623
数据列:
bug_id 924624 非空值
assign_to 924624 个非空值
bug_file_loc 427318 非空值
bug_severity 924624 非空值
bug_status 924624 非空值
creation_ts 924624 个非空值
delta_ts 924624 个非空值
short_desc 924624 非空值
host_op_sys 924624 个非空值
guest_op_sys 924624 个非空值
优先级 924624 个非空值
rep_platform 924624 非空值
记者 924624 非空值
product_id 924624 非空值
category_id 924624 个非空值
component_id 924624 非空值
分辨率 924624 非空值
target_milestone 924624 个非空值
qa_contact 924624 非空值
status_whiteboard 924624 个非空值
投票 924624 个非空值
关键字 924624 个非空值
lastdiffed 924509 个非空值
everconfirmed 924624 个非空值
report_accessible 924624 非空值
cclist_accessible 924624 非空值
估计时间 924624 个非空值
剩余时间 924624 个非空值
截止日期 0 非空值
别名 0 非空值
found_in_product_id 924624 个非空值
found_in_version_id 924624 个非空值
found_in_phase_id 924624 个非空值
cf_type 924624 非空值
cf_reported_by 924624 个非空值
cf_attempted 89622 非空值
cf_failed 89587 非空值
cf_public_summary 510799 非空值
cf_doc_impact 924624 非空值
cf_security 924624 非空值
cf_build 327460 非空值
cf_branch 614929 非空值
cf_change 300612 非空值
cf_test_id 12610 非空值
cf_regression 924624 非空值
cf_reviewer 924624 非空值
cf_on_hold 924624 个非空值
cf_public_severity 924624 非空值
cf_i18n_impact 924624 非空值
cf_eta 3910 非空值
cf_bug_source 924624 非空值
cf_viss 725 个非空值
数据类型:float64(5)、int64(19)、object(28)
数据类型:datetime64[ns](2)、float64(5)、int64(19)、object(26)
- 并将转换后的数据帧放入 hdfstore 成本:749.50 s :)
- 似乎减少“对象”数据类型的数量是降低时间成本的关键
- 并将转换后的数据帧放入 hdfstore 中,参数 'table' 为 true 仍会返回该错误
/usr/local/lib/python2.6/dist-packages/pandas-0.10.1.dev_6e2b6ea-py2.6-linux-x86_64.egg/pandas/io/pytables.pyc in create_axes(self, axes, obj, validate , nan_rep, data_columns, min_itemsize, **kwargs)
2203 加薪
2204 除外(例外),详细信息:
-> 2205 raise Exception("找不到正确的原子类型 -> [dtype->%s] %s" % (b.dtype.name, str(detail)))
2206 j += 1
2207
例外:找不到正确的原子类型 -> [dtype->object] 类型“datetime.datetime”的对象没有 len()
更新 4
- mysql中有4列类型为datetime:
- creation_ts
- delta_ts
- 最后的差异
- 截止日期
调用convert_objects()后:
时间戳:1998-05-06 21:27:00
时间戳:2012-05-09 14:41:41
datetime.datetime(2012, 5, 9, 14, 41, 41)
- deadline 始终为 None,无论是在调用 'convert_objects' 之前还是之后
没有
- 放置没有列 'lastdiff' 的数据框会花费 691.75 秒
- 当放置没有列 'lastdiff' 的数据框并将参数 'table' 设置为 True 时,我遇到了一个新错误:
/usr/local/lib/python2.6/dist-packages/pandas-0.10.1.dev_6e2b6ea-py2.6-linux-x86_64.egg/pandas/io/pytables.pyc in create_axes(self, axes, obj, validate , nan_rep, data_columns, min_itemsize, **kwargs)
2203 加薪
2204 除外(例外),详细信息:
-> 2205 raise Exception("找不到正确的原子类型 -> [dtype->%s] %s" % (b.dtype.name, str(detail)))
2206 j += 1
2207
例外:找不到正确的原子类型 -> 'Decimal' 类型的 [dtype->object] 对象没有 len()
- mysql 中列 'estimated_time'、'remaining_time'、'cf_viss' 的类型是 'decimal'
更新 5
- 我已通过以下代码将这些“十进制”类型列转换为“浮点”类型:
no_diffed_converted_df_bugs.estimated_time = no_diffed_converted_df_bugs.estimated_time.map(float)
- 而现在,时间成本是 372.84 秒
- 但是'table'版本的put仍然报错:
/usr/local/lib/python2.6/dist-packages/pandas-0.10.1.dev_6e2b6ea-py2.6-linux-x86_64.egg/pandas/io/pytables.pyc in create_axes(self, axes, obj, validate , nan_rep, data_columns, min_itemsize, **kwargs)
2203 加薪
2204 除外(例外),详细信息:
-> 2205 raise Exception("找不到正确的原子类型 -> [dtype->%s] %s" % (b.dtype.name, str(detail)))
2206 j += 1
2207
例外:找不到正确的原子类型 -> [dtype->object] 类型为“datetime.date”的对象没有 len()