数据输入和输出#
大数据计算服务#
读取并转换为表格#
用户可以使用 read_odps_table() 创建来自大数据计算服务表的 MaxFrame DataFrame 对象,并使用 DataFrame.to_odps_table() 将计算结果存储到大数据计算服务表中。
例如,如果您想从非分区表 test_odps_table 获取数据,通过 MaxFrame 进行一些转换,并将其存储到另一个分区表 test_processed_odps_table 中,您可以使用 read_odps_table() 如下所示。
import maxframe.dataframe as md
df = md.read_odps_table("test_odps_table")
processed_df = df[df.A > 10]
processed_df.to_odps_table("test_processed_odps_table")
如果表是分区的,read_odps_table 将从所有分区读取数据,如果存在多个分区,这应被绝对避免。您可以通过 partitions 参数选择一个分区或多个分区。
df = md.read_odps_table(
"parted_odps_table", partitions=["pt1=20240119,pt2=10", "pt1=20240119,pt2=11"]
)
默认情况下,分区列的值不会包含在结果中。如果您需要这些值,您可以指定 append_partitions=True。
df = md.read_odps_table(
"parted_odps_table", partitions=["pt1=20240119,pt2=10"], append_partitions=True
)
默认情况下,生成的 DataFrame 将产生 RangeIndex。您可以使用 index_col 参数指定现有列作为索引。
df = md.read_odps_table(
"parted_odps_table", partitions=["pt1=20240119,pt2=10"], index_col=["idx_col"]
)
如果您想要将预处理的 df 存储到大数据计算服务表中,您可以使用 to_odps_table() 如下所示。
df.to_odps_table("output_table_name").execute()
您可以通过 index 和 index_label 参数控制索引输出的行为。默认情况下,索引会被输出。如果您不想输出索引,您可以将 index 参数设置为 False。
df.to_odps_table("output_table_name", index=False).execute()
默认情况下,索引列的名称是索引的名称。如果没有指定索引名,则如果索引只有一个级别,将使用名称 index,否则将使用 level_x,其中 x 是级别的整数索引。
数据可以存储为分区表。您可以将 partition 参数指定为要写的分区。
df.to_odps_table("parted_table", partition="pt=20240121,h=12").execute()
您还可以指定列作为分区列。这些列的数据将动态决定行将被写入哪个分区。
df.to_odps_table("parted_table", partition_col=["pt_col"]).execute()
从 SQL 查询读取#
用户可以通过使用 read_odps_query() 来使用大数据计算服务查询创建 MaxFrame DataFrame 对象。MaxFrame 将使用 EXPLAIN 语句检索 DataFrame 架构并在大数据计算服务中执行查询。
例如,您可以使用以下 SQL 语句创建一个 DataFrame。
md_df = md.read_odps_query(
"SELECT a.shop_name AS ashop, b.shop_name AS bshop FROM sale_detail_jt a "
"RIGHT OUTER JOIN sale_detail b ON a.shop_name=b.shop_name"
)
pandas 对象#
用户可以通过使用 read_pandas() 和 DataFrame.to_pandas() 在本地 pandas 对象和 DataFrame 之间进行转换。
当调用 read_pandas 时,这些 pandas 对象将被上传到大数据计算服务并用于集群。
md_df = md.read_pandas(pd_df)
在 MaxFrame 完成转换后,数据可以使用 to_pandas 下载到客户端。
pd_df = md_df.to_pandas()