我正在尝试使用 pandas hdf5 构建一个 ETL 工具包。
我的计划是
- 从mysql中提取表到DataFrame;
- 将此 DataFrame 放入 HDFStore;
但是当我执行第 2 步时,我发现将数据框放入 *.h5 文件会花费太多时间。
- 源mysql服务器中的表大小:498MB
- 52列
- 924,624 条记录
- 将数据框放入后 *.h5 文件的大小:513MB
- 'put' 操作花费 849.345677137 秒
我的问题是:
这个时间成本正常吗?
有没有办法让它更快?
更新 1
谢谢杰夫
我的代码很简单:
extract_store = HDFStore('extract_store.h5')
extract_store['df_staff'] = df_staff- 当我尝试“ptdump -av file.h5”时,出现错误,但我仍然可以从这个 h5 文件加载数据框对象:
tables.exceptions.HDF5ExtError:HDF5 错误回溯
文件“../../../src/H5F.c”,第 1512 行,在 H5Fopen 中
无法打开文件文件“../../../src/H5F.c”,第 1307 行,在 H5F_open
无法读取超级块文件“../../../src/H5Fsuper.c”,第 305 行,在 H5F_super_read 中
无法找到文件签名文件“../../../src/H5Fsuper.c”,第 153 行,在 H5F_locate_signature
中找不到有效的文件签名HDF5 错误回溯结束
无法打开/创建文件“extract_store.h5”
- 其他一些信息:
- 熊猫版本:'0.10.0'
- 操作系统:ubuntu 服务器 10.04 x86_64
- cpu: 8 * Intel(R) Xeon(R) CPU X5670 @ 2.93GHz
- 内存总量:51634016 kB
我会将 pandas 更新为 0.10.1-dev 并重试。
更新 2
- 我已将熊猫更新为“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 中,参数“表”为 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
- 数据框的图片(只需在 ipython 笔记本中输入“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)
- 在“convert_objects()”之后:
数据类型:datetime64[ns](2)、float64(5)、int64(19)、object(26)
- 并将转换后的数据帧放入 hdfstore 成本:749.50 s :)
- 似乎减少“对象”数据类型的数量是降低时间成本的关键
- 并将转换后的数据帧放入具有参数“表”为真的 hdfstore 仍然返回该错误
/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:
- 创建_ts
- delta_ts
- 最后的差异
- 最后期限
调用 convert_objects() 后:
- 创建_ts:
时间戳:1998-05-06 21:27:00
- delta_ts:
时间戳:2012-05-09 14:41:41
- 最后的差异
datetime.datetime(2012, 5, 9, 14, 41, 41)
- 截止日期始终为无,无论在调用“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()
- 'estimated_time'、'remaining_time'、'cf_viss' 列的类型在 mysql 中是 'decimal'
更新 5
- 我已通过以下代码将这些“十进制”类型列转换为“浮点”类型:
no_diffed_converted_df_bugs.estimated_time = no_diffed_converted_df_bugs.estimated_time.map(float)
- 现在,时间成本为372.84 s
- 但 '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()