DataWorks数据太大用不了to_pandas(),我想用sklearn的算法需要array格式的数据,PyODPS DataFrame格式的数据咋转换呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在DataWorks中使用PyODPS时,如果数据量较大,直接调用to_pandas()
方法可能会导致内存不足(OOM)问题。为了将PyODPS DataFrame格式的数据转换为适合sklearn
算法使用的array
格式,可以采用以下方法:
为了避免一次性加载过多数据到内存中,可以通过分块读取的方式逐步处理数据。PyODPS支持通过execute()
方法执行DataFrame操作,并结合open_reader()
方法逐批读取数据。
from odps.df import DataFrame
import numpy as np
# 创建DataFrame对象
iris = DataFrame(o.get_table('pyodps_iris'))
# 定义一个空的列表用于存储分块数据
data_chunks = []
# 分块读取数据
with iris.execute().open_reader() as reader:
for record in reader:
# 将每条记录转换为数组并添加到列表中
data_chunks.append(list(record.values()))
# 将所有分块数据合并为一个NumPy数组
data_array = np.array(data_chunks)
print(data_array)
说明: - reader
对象支持迭代读取数据,每次读取一条记录。 - 使用record.values()
提取每条记录的值,并将其转换为Python原生数据类型(如列表)。 - 最后将所有分块数据合并为一个NumPy
数组,供sklearn
算法使用。
如果数据量非常大,建议先通过SQL对数据进行预处理,减少需要加载到内存中的数据量。例如,可以在SQL中完成特征选择、过滤或聚合操作,然后将结果加载到DataFrame中。
import numpy as np
# 执行SQL查询,仅选择需要的列
sql_query = "SELECT sepal_length, sepal_width FROM pyodps_iris WHERE species = 'setosa'"
instance = o.execute_sql(sql_query)
# 读取SQL查询结果
data_chunks = []
with instance.open_reader() as reader:
for record in reader:
data_chunks.append([record['sepal_length'], record['sepal_width']])
# 转换为NumPy数组
data_array = np.array(data_chunks)
print(data_array)
说明: - 通过SQL查询筛选出需要的字段和数据范围,减少数据传输量。 - 使用open_reader()
方法读取SQL查询结果,并将其转换为NumPy
数组。
如果本地处理能力有限,可以考虑使用Serverless资源组来运行PyODPS任务。Serverless资源组可以根据任务需求动态分配计算资源,从而避免内存不足的问题。
to_pandas()
:当数据量较大时,to_pandas()
会将所有数据加载到内存中,可能导致OOM错误。建议优先使用分块读取或SQL预处理的方式。matplotlib
)。因此,sklearn
算法需要在本地或其他环境中运行。open_reader()
最多只能读取一万条记录。如果需要读取更多数据,请手动开启Instance Tunnel
:
from odps import options
options.tunnel.use_instance_tunnel = True
options.tunnel.limit_instance_tunnel = False
通过上述方法,您可以将PyODPS DataFrame格式的数据逐步转换为NumPy
数组,从而满足sklearn
算法对array
格式数据的需求。推荐优先使用分块读取或SQL预处理的方式,以避免内存不足的问题。
DataWorks基于MaxCompute/Hologres/EMR/CDP等大数据引擎,为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台。