读取odps表数据

前言

这是我第一次写博客,在工作的这一段时间,几乎每天都会学到新的东西,做为一个普通人,我也深感自身记忆力的 一般,所以想通过博客的方式将自己在平时工作中遇到的技术点记录下来,积累的同时也能进行分享。

问题

由于需要从odps表中读取数据,所以我一开始使用的是spark自带DataSource的API方式进行数据读取,具体代码如下:

val df = spark
      .read
      .format("org.apache.spark.aliyun.odps.datasource")
      .option("spark.hadoop.fs.oss.impl", "com.aliyun.fs.oss.nat.NativeOssFileSystem")
      .option("odpsUrl", odpsUrl)
      .option("tunnelUrl", tunnelUrl)
      .option("table",  table)
      .option("project", project)
      .option("accessKeyId", accessKeyId)
      .option("accessKeySecret", accessKeySecret)
      .load()

可是我发现这样做有个问题,spark读取odps表时,对于有些类型的字段无法正常读取,例如:string,datetime类型都报无法传输的错误,所以我经过考虑后认为可以使用阿里云的maxCompute SDK提供的接口进行读取数据。

依赖

<dependency>
            <groupId>com.aliyun.emr</groupId>
            <artifactId>emr-core</artifactId>
            <version>1.4.3</version>
</dependency>
<dependency>
            <groupId>com.aliyun.emr</groupId>
            <artifactId>emr-maxcompute_2.11</artifactId>
            <version>1.4.3</version>
</dependency>

代码

第一种
使用SQLAPI接口进行数据读取,但这种方式一次只能读取一万条数据,存在局限性。

val account = new AliyunAccount(accessKeyId,  accessKeySecret)
val odps = new Odps(account)
odps.setEndpoint(odpsUrl)
odps.setDefaultProject(project)

val instance: Instance = SQLTask.run(odps, "select * from dw_user;")
instance.waitForSuccess()
val resultSet: ResultSet = SQLTask.getResultSet(instance)

while (resultSet.hasNext){

      val record: Record = resultSet.next()
      if(record.get("register_spm") != null){

        println(record.getString("user_id"))
      }

第二种
使用tunnel接口进行数据读取

val account = new AliyunAccount(accessKeyId,  accessKeySecret)
val odps = new Odps(account)
odps.setEndpoint(odpsUrl)
odps.setDefaultProject(project)

val tunnel = new TableTunnel(odps)
val spec = new PartitionSpec("year_id=2015")
tunnel.setEndpoint(tunnelUrl)

val session: TableTunnel#DownloadSession = tunnel.createDownloadSession(project, table,spec)
val count: Long = session.getRecordCount
println(count)
val tunnelReader: TunnelRecordReader = session.openRecordReader(0,count)
var i = 1
while (i<=count){

    val record: Record = tunnelReader.read()
    if(record.get("register_spm")!=null){

       println(record.getString("register_spm"))
     }
      i= i+1
   }
   
   tunnelReader.close()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用阿里云ODPS Java SDK API获取元数据实例,您可以遵循以下步骤: 1. 创建ODPS对象并设置accessId和accessKey: ```java import com.aliyun.odps.Odps; import com.aliyun.odps.OdpsException; import com.aliyun.odps.account.Account; import com.aliyun.odps.account.AliyunAccount; Account account = new AliyunAccount("<access_id>", "<access_key>"); Odps odps = new Odps(account); odps.setEndpoint("<odps_endpoint_url>"); ``` 2. 创建Table对象并获取的元数据信息: ```java import com.aliyun.odps.Table; import com.aliyun.odps.TableSchema; import com.aliyun.odps.columns.Column; import com.aliyun.odps.columns.ColumnType; Table table = odps.tables().get("<project_name>", "<table_name>"); TableSchema schema = table.getSchema(); // 获取的列信息 for (Column col : schema.getColumns()) { System.out.println("列名: " + col.getName() + " 类型: " + col.getType().toString()); } // 获取的分区信息 if (table.getPartitionColumns().size() > 0) { System.out.println("分区列名: " + table.getPartitionColumns().get(0).getName()); } ``` 3. 创建Partition对象并获取分区的元数据信息: ```java import com.aliyun.odps.Partition; import com.aliyun.odps.PartitionSpec; PartitionSpec spec = new PartitionSpec(); spec.set("pt", "20220101"); Partition partition = odps.partitions().get("<project_name>", "<table_name>", spec); TableSchema schema = partition.getSchema(); // 获取分区的列信息 for (Column col : schema.getColumns()) { System.out.println("列名: " + col.getName() + " 类型: " + col.getType().toString()); } ``` 4. 创建Function对象并获取函数的元数据信息: ```java import com.aliyun.odps.Function; Function function = odps.functions().get("<project_name>", "<function_name>"); String className = function.getClassName(); String resources = function.getResources(); ``` 5. 创建Resource对象并获取资源的元数据信息: ```java import com.aliyun.odps.Resource; Resource resource = odps.resources().get("<project_name>", "<resource_name>"); String resourceName = resource.getName(); String comment = resource.getComment(); ``` 这些步骤将帮助您使用ODPS Java SDK API获取元数据的具体实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值