跳到主要内容

数据预览

MaxCompute SDK可以使用Table.read()方法,对表内数据进行预览。 本接口需要用户具有希望预览列的select权限。 SDK提供了多个重载的read方法,用于在不同限制条件下,读取表内的数据。以下是这些方法的说明和代码示例:

基本读取

读取表数据,最多返回指定数量的记录行数。

/**
* 读取表内的数据
* 读取数据时,最多返回 1w 条记录 (project read 默认值),若超过,数据将被截断。<br />
*
* @param limit 最多读取的记录行数
* @return {@link RecordReader}对象
* @throws OdpsException
*/
public RecordReader read(int limit)throws OdpsException;

高级读取

读取指定分区或列的数据,并能够控制读取行数。

  /**
* 读取表内的数据 <br />
* 读取数据时,最多返回 1w 条记录 (project read 默认值),若超过,数据将被截断。<br />
*
* @param partition 表的分区{@link PartitionSpec}。如不指定分区可传入null。
* @param columns 所要读取的列名的列表。如果读取全表可传入null
* @param limit 最多读取的记录行数。
* @return {@link RecordReader}对象
* @throws OdpsException
*/
public RecordReader read(PartitionSpec partition,List<String> columns,int limit)throws OdpsException;

兼容模式

我们在0.47.0-public 及以后的版本,更新了接口的返回类型。 为了便于老用户进行升级,我们新增了兼容旧Read接口返回类型的模式。 然而,此参数仅是在现有接口的基础上额外进行了类型转换,将导致额外的性能开销,不推荐用户使用。

  /**
* 读取表内的数据 <br />
* 读取数据时,最多返回 1w 条记录 (project read 默认值),若超过,数据将被截断。<br />
*
* @param partition 表的分区{@link PartitionSpec}。如不指定分区可传入null。
* @param columns 所要读取的列名的列表。如果读取全表可传入null
* @param limit 最多读取的记录行数。
* @param timezone 设置 datetime 类型数据的时区,新接口使用Java8无时区类型,故指定Timezone无效
* @param useLegacyMode 是否使用兼容旧Read接口模式,默认为false。老接口性能较差,不推荐。
* @return {@link ArrowStreamRecordReader}
* @throws OdpsException
*/
public RecordReader read(PartitionSpec partition,List<String> columns,int limit,
String timezone,boolean useLegacyMode)
throws OdpsException;

指定TunnelEndpoint

read接口底层使用tunnel endpoint进行读取,通常情况下,tunnel endpoint由SDK自动获取,用户无需关心。 当用户希望指定tunnel endpoint时,可以使用该接口

  /**
* 读取表内的数据 <br />
* 读取数据时,最多返回 1w 条记录 (project read 默认值),若超过,数据将被截断。<br />
*
* @param partition 表的分区{@link PartitionSpec}。如不指定分区可传入null。
* @param columns 所要读取的列名的列表。如果读取全表可传入null
* @param limit 最多读取的记录行数。
* @param timezone 设置 datetime 类型数据的时区,新接口使用Java8无时区类型,故指定Timezone无效
* @param useLegacyMode 是否使用兼容旧Read接口模式,默认为false。老接口性能较差,不推荐。
* @return {@link ArrowStreamRecordReader}
* @throws OdpsException
*/
public RecordReader read(PartitionSpec partition,List<String> columns,int limit,
String timezone,boolean useLegacyMode,String tunnelEndpoint)
throws OdpsException;

RecordReader

对于RecordReader读取到的Record数据,其OdpsType与JavaType的映射关系如下

OdpsTypeJavaType
TINYINTjava.lang.Byte
SMALLINTjava.lang.Short
INTjava.lang.Integer
BIGINTjava.lang.Long
BINARYcom.aliyun.odps.data.Binary
FLOATjava.lang.Float
DOUBLEjava.lang.Double
DECIMAL(precision,scale)java.math.BigDecimal
VARCHAR(n)com.aliyun.odps.data.Varchar
CHAR(n)com.aliyun.odps.data.Char
STRINGjava.lang.String
DATEjava.time.LocalDate
DATETIMEjava.time.ZonedDateTime
TIMESTAMPjava.time.Instant
BOOLEANjava.lang.Boolean
TIMESTAMP_NTZjava.time.LocalDateTime
ARRAYjava.util.ArrayList
MAPjava.util.HashMap
STRUCTcom.aliyun.odps.data.SimpleStruct
JSONcom.aliyun.odps.data.JsonValue

注意

  • 在 0.47.0-public 及以后的版本,read接口使用TableTunnel的preview方法进行重新实现。与之前版本相比,变化如下

    1. OdpsType与JavaType的映射关系,时间类型使用了Java8推荐的无时区类型。

      OdpsTypeNewLegacy
      DATEjava.time.LocalDatejava.sql.Date
      DATETIMEjava.time.ZonedDateTimejava.util.Date
      TIMESTAMPjava.time.Instantjava.sql.Timestamp
    2. 对报错信息,进行了重新设计,更便于用户理解。

  • Read 接口仅适用于数据预览,对于大量数据,推荐使用 TableTunnel

  • Read 接口的输出,不保证有序。