数据输入和输出#

大数据计算服务#

读取并转换为表格#

用户可以使用 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()

您可以通过 indexindex_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()