【ODPS】阿里云ODPS中带分区的表操作

摘要:
例如:pt='1',ds='2'*/PartitionSpecpartitionSpec1=newPartitionSpec/*另一方面,调用结构参数构造函数,然后调用构造集方法*/PartitionSpecpartitionSpec2=newPartitionSpec();partitionSpec2.set;在TableTunnel类中创建和创建上载会话有两种方法:createUploadSessionpublicTableTunnel.UploadSessionCreateUploadSessionhrowsTTunnelException在非分区表上创建上载会话参数:projectName项目名称tableName表名称,非视图返回:TableTunnel.UploadSessionThrows:TunnelExceptioncreateUploadSessionpublicTableTunnel_UploadSessioncreateUploadSessionhrowsTunnelException在分区表上创建上载会话注意:分区必须是最后一级分区。如果表具有两级分区pt、ds,则必须指定所有值。不支持仅指定其中一个值Parameters:projectName Project nametableName table name,Non-view partitionSpec-指定分区PartitionSpecReturns:TableTunnel.UploadSessionThrows:TunnelException分区表必须使用分区的构造方法。您还必须确保分区存在,否则将报告异常。

1.创建分区表:

分区表有自己的分区列,而分区表则没有。

public static void createTableWithPartition(Odps odps, String createTableName)
			throws Exception {
		Tables tables = odps.tables();// /获取表示ODPS全部Table的集合对象
		boolean a = tables.exists(createTableName);// 推断指定表test_table_jyl是否存在
		if (a) {
			System.out.println("指定表存在");
			Table table = tables.get(createTableName);
			tables.delete(createTableName);//存在就删除
		} else {
			System.out.println("指定表不存在");
		}
		System.out.println("-------------------------------------------------");
		
		/* 创建表 */
		if (tables.exists(createTableName)) {
			System.out.println("指定表存在,无法创建");
		} else {
			System.out.println("指定表不存在,能够创建");
			/* TableSchema表示ODPS中表的定义 */
			TableSchema tableSchema = new TableSchema();
			/* 加入列 */
			Column col; // Column表示ODPS中表的列定义
			col = new Column("id", OdpsType.STRING, "ID");
			tableSchema.addColumn(col);
			col = new Column("name", OdpsType.STRING, "姓名");
			tableSchema.addColumn(col);
			col = new Column("sex", OdpsType.BIGINT, "性别");
			tableSchema.addColumn(col);
			col = new Column("birthday", OdpsType.DATETIME, "生日");
			tableSchema.addColumn(col);

			/* 加入分区列 */
			col = new Column("province ", OdpsType.STRING, "省(分区列)");
			tableSchema.addPartitionColumn(col);
			
			tables.create(createTableName, tableSchema);//创建表
			System.out.println("表【" + createTableName + "】创建成功");
		}
		System.out.println("-------------------------------------------------");

	}


2.分区表数据上传:

分区表上传数据必须指定分区。所以上传数据前必须保证存在分区,不存在就创建一个,创建分区有两种方法

/*PartitionSpec类表示一个特定分区的定义*/
		String partitionColumn="province";//表中的分区列
		/*第一种,直接调用带參构造函数,
		 * 參数格式:分区定义字符串。比方: pt='1',ds='2'
		 */
		PartitionSpec partitionSpec1 = new PartitionSpec(partitionColumn+"='hubei'");
		
		/*另外一种,调用布带參数构造函数,再调用队形set方法。

*/ PartitionSpec partitionSpec2 = new PartitionSpec(); partitionSpec2.set(partitionColumn, "hubei");


TableTunnel类中有两个创建创建上传会话方法:

createUploadSession

public TableTunnel.UploadSession createUploadSession(String projectName,
                                                     String tableName)
                                              throws TunnelException
在非分区表上创建上传会话

Parameters:
projectName - Project名称
tableName - 表名,非视图
Returns:
TableTunnel.UploadSession
Throws:
TunnelException

createUploadSession

public TableTunnel.UploadSession createUploadSession(String projectName,
                                                     String tableName,
                                                     PartitionSpec partitionSpec)
                                              throws TunnelException
在分区表上创建上传会话

注: 分区必须为最末级分区,如表有两级分区pt,ds, 则必须所有指定值, 不支持仅仅指定当中一个值

Parameters:
projectName - Project名
tableName - 表名,非视图
partitionSpec - 指定分区 PartitionSpec
Returns:
TableTunnel.UploadSession
Throws:
TunnelException


分区表必须使用带分区的构造方法。还必须保证该分区存在,否则会报异常。

public static void uploadDataToYun(Odps odps, String project, String tableName)
			throws Exception {
		TableTunnel tunnel = new TableTunnel(odps);
		tunnel.setEndpoint(TUNNEL_URL);// 设置TunnelServer地址,没有设置TunnelServer地址的情况下自己主动选择
		
		/*PartitionSpec类表示一个特定分区的定义*/
		String partitionColumn="province";//表中的分区列
		PartitionSpec partitionSpec = new PartitionSpec();
		partitionSpec.set(partitionColumn, "hubei");
		
		Table table = odps.tables().get(tableName);//获取当前表
		boolean a= table.hasPartition(partitionSpec);//推断上述定义分区在表中是否存在
		if(a){
			System.out.println("分区已经存在,能够直接上传数据");
		}else{
			System.out.println("分区不存在,先创建分区再上传数据");
			table.createPartition(partitionSpec);
		}
		
		/*在分区表上创建上传会话*/
		TableTunnel.UploadSession uploadSession = tunnel.createUploadSession(
				project, tableName,partitionSpec);

		RecordWriter rw = uploadSession.openRecordWriter(1);
		Column[] columns = new Column[4];
		columns[0] = new Column("id", OdpsType.STRING);
		columns[1] = new Column("name", OdpsType.STRING);
		columns[2] = new Column("sex", OdpsType.BIGINT);
		columns[3] = new Column("birthday", OdpsType.DATETIME);
		Record r = new ArrayRecord(columns);
		
		r.setString("id", "3");
		r.setString("name", "name3");
    	r.setBigint("sex", (long) 2);
    	Date date = new Date();
    	r.setDatetime("birthday", date);
    	rw.write(r);
    	rw.close();//一定要close,不然无法commit

		Long[] blocks = uploadSession.getBlockList();
		uploadSession.commit(blocks);
		System.out.println("数据上传成功");
	}


3.測试类:

	private static final String ACCESS_ID = "***********";
	private static final String ACCESS_KEY = "***************";
	private static final String PROJECT_NAME = "*************";
	private static final String TUNNEL_URL = "http://dt.odps.aliyun.com";
	private static final String ODPS_URL = "http://service.odps.aliyun.com/api";
	
	public static void main(String args[]) throws Exception {

		/* 先构建阿里云帐号 */
		Account account = new AliyunAccount(ACCESS_ID, ACCESS_KEY);
		
		/* Odps类是ODPS SDK的入口 */
		Odps odps = new Odps(account);
		odps.setDefaultProject(PROJECT_NAME);// 指定默认使用的Project名称
		odps.setEndpoint(ODPS_URL);// 设置ODPS服务的地址
		
		String tableName="test_table_jyl";
		/*创建带分区的表*/
		createTableWithPartition(odps,tableName);
		
		/*上传数据*/
		uploadDataToYun(odps, PROJECT_NAME, tableName);
	}



免责声明:文章转载自《【ODPS】阿里云ODPS中带分区的表操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇中国裁判文书网全网最新爬虫分析layer弹出层框架alert与msg详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用群晖作mineportalbox(3):在阿里云上单盘安装群晖skynas

本文关键字:将群晖安装在阿里云主机上,skynas系统盘和数据盘同盘。mineportal3硬件选型,webpe,提取群晖webpe,使用webpe代替diskbios 在前面我们讲到省事直接使用白群晖的方式,和提到一些需要hacker的地方,有些时候,正规一成不变的方式和硬件的方式有时的确是难于忍受的。从本篇开始我们探究一些群晖的奇特面,比如将其安装在云...

安装XP和Ubuntu双系统问题——Ubuntu安装时无法识别原有系统

  我主机本来安装了windows xp 和unbuntu15.04,由于在ubuntu下不小心卸载某依赖后,无法登入桌面,网上查了好多资料,原因各种,解决途径也各种,最终是还没有解决问题。各种更新,各种补丁,各种命令都尝试,然后还是水平有限,折腾了2天,不想无奈之下,只能选择重装了。具体的解决登入桌面的过程我这遍就不详细写了,太凌乱,太多了,我已经记不清...

阿里云产品之数据中台架构

1. 场景描述 客户打包买了很多阿里云的产品,但是阿里云不负责实施,基于阿里云产品与客户需求,拟采用的数据中台架构,有类似需求的,可以参考下,拿走不谢! 2. 解决方案 阿里产品大数据架构图: 从下到上,简要介绍下各个阿里产品作用及承担的任务: 2.1 云数据库 RDS 阿里云关系型数据库RDS(Relational Database Service)是...

iOS 集成阿里百川最新版(3.1.1.96) 实现淘宝授权登录以及调用淘宝客户端商品详情页

    公司最近要做第三方登录,由于是做导购项目,必不可少的有淘宝的授权登录。本来就是一个授权登录,没什么大不了的。但淘宝的无线开放业务——阿里百川更新的最新版本3.1.1.96,开发文档不是不详细,是很不详细。于是乎就自己摸着石头过河了,还好自己搞出来了。 虽说淘宝的文档不详细,但有些必须的说明还是要看的。 接入之前要先看看: 准备工作百川接入说明S...

阿里云DataV可视化使用疑虑及解决方法

1.dataV使用要求 datav访问需要使用高版本chrome浏览器 要60版本以上 如果使用的组件比较多 并且使用3D组件这些 对配置也有一定的要求 大屏最好是图形显卡 以及 16G内存以上 个人电脑的话 最好是游戏性能显卡 以及 16G内存以上 有没有电视可以直接访问dataV发布的url,效果不受影响 目前不定 2.dataV可视化...

Selenium3+python3自动化(四十八)--阿里云centos7上搭建selenium启动chrome浏览器headless无界面模式

前言 selenium在windows机器上运行,每次会启动界面,运行很不稳定。于是想利用chrome的headless无界面模式,确实方便了不少。 为了提高自动化运行的效率和稳定性,于是把selenium自动化环境部署到linux服务器上,这样更方便。 环境: centos 7 python 3.7 chrome 85.0.4183.83 chromed...