ABAP 新语法--Open SQL(草稿)
1. 常量
1.1 常量赋值
常量字段可以用来为内表中的部分字段赋初始值,字段类型和长度依据输入常量的值决定
SELECTmara~matnr, " 物料号mara~matkl, " 物料组mara~mtart, " 物料类型' ' AS lkenz, " 删除标识,常量空字符串123 AS flag " 常量数字FROM maraINTO TABLE @DATA(lt_mara)UP TO 100 ROWS.cl_demo_output=>display( lt_mara ).
像上面的删除标识字段就蛮有用的,循环内表有时候需要根据复杂的条件决定该行目是否需要,此时若不需要就打上删除标记’X’,最后再用 delete {table} where lkenz = ‘X’ 一次性删除
2. 宿主变量/表达式
2.1 作为SQL操作数
通常在查询语句中,程序声明(非数据库层级)的变量前需要使用转义符 @ 进行标识,这些宿主变量通常被用作 Open SQL 语句中的操作数
在查询语句内部声明结构/内表时,应该在 DATA 前使用转义符
此外,在使用宿主表达式(在 Open SQL 中作为操作数使用的一些表达式) 时,也需要添加转义字符,如下例所示
注:表达式内部的变量不需要再使用转义符,且不能使用表达式外部的数据库对象
DATA: lv_maktx TYPE makt-maktx VALUE '物料描述'.SELECTmara~matnr, " 物料号mara~matkl, " 物料组mara~mtart, " 物料类型@lv_maktx AS maktx, " 物料描述 宿主变量@( COND char10( WHEN sy-langu = '1' THEN '中文'WHEN sy-langu = 'E' THEN 'English'ELSE '其他语言' ) ) AS langu " 物料语言 宿主表达式FROM maraINTO TABLE @DATA(lt_mara)UP TO 100 ROWS.cl_demo_output=>display( lt_mara ).
3. 聚合表达式
3.1 对一组数据计算
聚合表达式用于对一组值执行计算并返回单一的值,可以使用在SELECT或HAVING子句中,不能用在WHERE子句
WHERE 子句的搜索条件在进行分组操作之前应用;而 HAVING 的搜索条件则在进行分组操作之后应用
常见的聚合表达式如下,表达式内部可选用DISTINCT对数据去重后再进行处理:
- AVG:返回结果集的平均值,返回类型默认为浮点型,可通过AS语句返回指定类型,如DEC,CURR,QUAN或FLTP
- MAX:返回结果集的最大值
- MIN:返回结果集的最小值
- SUM:返回结果集的汇总值
- COUNT:返回结果集的条目数,通常情况下使用COUNT( * ) / COUNT(*),需要使用DISTINCT时则要指定字段名
SELECTvbeln, " 交货单号MAX( lfimg ) AS max_lfimg, " 最大交货数量MIN( lfimg ) AS min_lfimg, " 最小交货数量AVG( lfimg AS DEC( 14,3 ) ) AS avg_lfimg, " 平均交货数量SUM( lfimg ) AS sum_lfimg, " 总交货数量COUNT(*) AS count_lfimg, " 总行目数AVG( DISTINCT lfimg AS DEC( 14,3 ) ) AS avg_dstct_lfimg, " 去重交货数量SUM( DISTINCT lfimg ) AS sum_dstct_lfimg, " 去重总交货数量COUNT( DISTINCT lfimg ) AS count_dstct_lfimg " 去重总行目数FROM lips ##DB_FEATURE_MODE[TABLE_LEN_MAX1]WHEREvbeln BETWEEN '8000000061' AND '8000000069'GROUP BY vbelnINTO TABLE @DATA(lt_data).SORT lt_data BY vbeln.
4. 嵌入表达式
4.1 数值
在 SELECT LIST 使用内嵌表达式来处理数值,使用时需注意传入参数的类型
常见的数值表达式如下:
- ABS:获取绝对值
- CEIL:向上取整
- FLOOR:向下取整
- DIV:除法计算,取整数位
- DIVISION:除法计算,保留 N 位小数
- MOD:除法计算,取余数
- ROUND:计算舍入值
DATA(lv_num) = CONV lfimg( '-123.456' )." 简化测试,全部用宿主变量SELECT SINGLE@lv_num AS num , " 原始值ABS( @lv_num ) AS abs_num , " 绝对值CEIL( @lv_num ) AS ceil_num , " 向上取整FLOOR( @lv_num ) AS floor_num , " 向下取整DIV( 5 , 2 ) AS div_num , " 除法,整数DIVISION( 5 , 2 , 2 ) AS divison_num , " 除法,保留n位小数MOD( 5 , 2 ) AS mod_num , " 取余ROUND( @lv_num , 2 ) AS rount_num_po , " 四舍五入,N为正数时,保留小数点后N位ROUND( @lv_num , -2 ) AS rount_num_ne " 四舍五入,N为负数时,保留小数点前N位FROM lips ##DB_FEATURE_MODE[TABLE_LEN_MAX1]INTO @DATA(ls_data).
4.2 字符串
在 SELECT LIST 使用内嵌表达式来处理字符串, 通常情况下字符串返回结果不能超过255个字符,如果字符长度异常,语法检查时会有错误提示
- CONCAT:连接字符串,参数固定为2个,各个表达式之间可以嵌套使用,CONCAT内部也可以使用 &&
- &&:连接字符串,参数没有个数限制,但不能将其他内嵌表达式当作参数使用,仅作为操作符使用,在非SELECT语句中也可以被使用
- CONCAT_WITH_SPACE:连接字符串,并用 N 个空格分隔,该表达式结果不能超过1333个字符
- INSTR:遍历字符串,查找指定字符 s1 并返回第一次出现的位置,没有查到则返回0
- LEFT/RIGHT:从字符串左/右侧开始取出 N 位字符,忽略前导/尾部的空格
- LENGTH:计算字符串长度
SELECT concat( carrid , currcode ) AS concat ,carrid && currcode AS concat_sign ,concat_with_space( carrid , currcode , 1 ) AS with_space ,instr( carrid , 'BA' ) AS instr ,left( carrname , 4 ) AS left ,right( carrname , 4 ) AS right ,length( carrname ) AS lengthFROM scarrINTO TABLE @DATA(lt_data)UP TO 5 ROWS.
- LOWER/UPPER:将字符串转换成小写/大写
- LPAD/RPAD:在字符串左侧/右侧填充指定字符 s1,直到字符串长度为 N,如果初始值长度>=N,则不会填充,但是超过 N 位的字符会被截断
- LTRIM/RTRIM:从字符串左侧/右侧开始逐个删除指定字符 s1,直到出现其他字符为止,默认会删除尾部的空格
- REPLACE:将字符串中所有的指定字符 s1 用其他字符 s2 代替
- SUBSTRING:从字符串第 N 位开始截取长度为 M 的字符,系统会默认检查截取范围是否超出该字段最大长度,以避免造成DUMP
SELECT lower( carrid ) AS lower,upper( carrid ) AS upper,lpad( carrid , 5 , 'B' ) AS lpad,rpad( carrid , 5 , 'B' ) AS rpad,ltrim( carrid , 'A' ) AS ltrim,rtrim( carrid , 'A' ) AS rtrim,replace( carrid , 'A' , '@' ) AS replace,substring( carrname , 5 , 10 ) AS substring FROM scarrINTO TABLE @DATA(lt_data)UP TO 3 ROWS.
4.3 日期/时间
在 SELECT LIST 使用内嵌表达式来处理日期/时间
- DATS_IS_VALID/TIMS_IS_VALID:校验日期/时间有效性,有效时返回 1,否则返回 0(时间有效性的函数有报错,可能版本不支持)
- DATS_DAYS_BETWEEN:计算日期d1和d2相隔的天数
- DATS_ADD_DAYS:为指定日期加上N天
- DATS_ADD_MONTHS:为指定日期加上N月
DATA(lv_date) = CONV datum( '20181022' ).SELECT fldate AS original_date,dats_is_valid( fldate ) AS valid_date,
* tims_is_valid( @sy-uzeit ) AS valid_time,dats_days_between( fldate , @lv_date ) AS between,dats_add_days( fldate , 10 ) AS add_days,dats_add_months( fldate , 3 ) AS add_monthsFROM sflightINTO TABLE @DATA(lt_data)UP TO 3 ROWS.
4.4 时间戳
在 SELECT LIST 使用内嵌表达式来处理时间戳
- TSTMP_IS_VALID:校验时间戳有效性,有效时返回 1,否则返回 0
- TSTMP_CURRENT_UTCTIMESTAMP:返回当前时间戳
- TSTMP_SECONDS_BETWEEN:计算时间戳 t1 和 t2 相隔的秒数,需要用赋值语句进行传参,可以添加相应的错误处理
- TSTMP_ADD_SECONDS:为指定时间戳加上 N 秒,N 必须为 timestamp 类型
DATA(lv_stamp_now) = CONV timestamp( '20190603133559' ).
DATA(lv_stamp_past) = CONV timestamp( '20190602161408' ).SELECT tstmp_is_valid( @lv_stamp_now ) AS valid_stamp,tstmp_current_utctimestamp( ) AS current_stamp,tstmp_seconds_between( tstmp1 = @lv_stamp_past,tstmp2 = @lv_stamp_now,on_error = @sql_tstmp_seconds_between=>set_to_null ) AS between,tstmp_add_seconds( tstmp = @lv_stamp_now,seconds = @( CONV timestamp( 999 ) ),on_error = @sql_tstmp_add_seconds=>set_to_null ) AS add_secondFROM sflightINTO TABLE @DATA(lt_data)UP TO 1 ROWS.
4.5 时区
ABAP_USER_TIMEZONE:获取用户时区,不传参时默认获取当前用户当前 Client 的时区
ABAP_SYSTEM_TIMEZONE:获取系统时区,不传参时默认获取当前 Client 的时区
SELECT abap_user_timezone( user = @( CONV uname( 'JIANGRE' ) ),client = '130',on_error = @sql_abap_user_timezone=>set_to_null ) AS user_zone,abap_system_timezone( client = '130',on_error = @sql_abap_system_timezone=>set_to_null ) AS sys_zoneFROM sflightINTO TABLE @DATA(lt_data)UP TO 1 ROWS.
4.6 日期/时间转换
在 SELECT LIST 使用内嵌表达式来转换日期/时间/时间戳
- TSTMP_TO_DATS:将时间戳转换成对应时区的日期
- TSTMP_TO_TIMS:将时间戳转换成对应时区的时间
- TSTMP_TO_DST:根据时间戳获取对应时区的夏令时标识
- DATS_TIMS_TO_TSTMP:将日期和时间根据时区转换成时间戳
DATA(lv_stamp) = CONV timestamp( '20190603133559' ).SELECT tstmp_to_dats( tstmp = @lv_stamp,tzone = @( CONV tznzone( 'CET' ) ) ) AS dats,tstmp_to_tims( tstmp = @lv_stamp,tzone = @( CONV tznzone( 'CET' ) ) ) AS tims,tstmp_to_dst( tstmp = @lv_stamp,tzone = @( CONV tznzone( 'CET' ) ) ) AS dst,dats_tims_to_tstmp( date = @sy-datum,time = @sy-uzeit,tzone = @( CONV tznzone( 'CET' ) ) ) AS tstmpFROM sflightINTO TABLE @DATA(lt_data)UP TO 1 ROWS.
5. Case
5.1 条件语句
在 SELECT 语句中使用 CASE 作为条件语句,与一般条件判断使用的 CASE 类似,但有所区别
该语句不仅可以用于单值判断,也可以根据复杂条件进行判断;
此外,WHEN OTHERS 不再适用,需要使用 ELSE 代替,语句结束时使用 END,而不是 ENDCASE,且需要定义别名
SELECT CASE currcodeWHEN 'EUR' THEN carrnameELSE urlEND AS case_simple, " 单值判断CASEWHEN currcode = 'EUR' THEN urlWHEN carrname <> ' ' THEN carrnameELSE carrid && '@' && currcodeEND AS case_complex " 复杂条件判断FROM scarrINTO TABLE @DATA(lt_data)UP TO 5 ROWS.
6. NULL Value
在使用 LEFT / RIGHT OUTER JOIN 关联外表时,如果主表中存在记录,但在外表中没有关联到数据,则外表的这部分字段的值在取数过程中始终为 NULL,在取数完成后传入数据对象时,NULL 会再转换成系统兼容的值,通常为初始值;
NULL 值用于数值计算或是字符串处理时返回结果仍为NULL值,可以在条件语句中用 IS [ NOT ] NULL 判断以及处理
DATA: lr_carrid TYPE RANGE OF s_carr_id.lr_carrid = VALUE #( sign = 'I' option = 'EQ' ( low = 'AA' )( low = 'CO' ) ).
SELECT DISTINCTr~carrid,CASEWHEN t~seatsocc IS NULL THEN 'IS NULL'WHEN t~seatsocc IS NOT NULL THEN 'IS NOT NULL'END AS field_statusFROM scarr AS rLEFT OUTER JOIN sflight AS t ON t~carrid = r~carridINTO TABLE @DATA(lt_data)WHERE r~carrid IN @lr_carrid.
相关文章:
ABAP 新语法--Open SQL(草稿)
1. 常量 1.1 常量赋值 常量字段可以用来为内表中的部分字段赋初始值,字段类型和长度依据输入常量的值决定 SELECTmara~matnr, " 物料号mara~matkl, " 物料组mara~mtart, " 物料类型 AS lkenz, " 删除标识,常量空字符串123 AS fla…...
2023最新常用开发网站汇总
1、在线画图工具 • 在线画图工具ProcessOn:https://www.processon.com/ • 在线画图工具draw.io:https://app.diagrams.net/ • 在线思维导图工具:http://www.mindline.cn/webapp • PlantUML在线编辑器:http://haha98k.com/…...
ELK 日志采集使用
1.安装ELK整体环境 1.1.安装docker环境 Docker 最新版Version 20.10安装_docker最新版本是多少_猿小飞的博客-CSDN博客 1.2.先安装docker compose 安装docker compose_猿小飞的博客-CSDN博客 1.3.使用 Docker Compose 搭建 ELK 环境 1.3.1.编写 docker-compose.yml 脚本启…...
深入剖析RocketMQ源码:消息传递的奥秘
RocketMQ是一款高性能、高可靠性、可扩展性强的分布式消息中间件,能够有效架构企业级分布式应用。由于其广泛应用和优秀表现,越来越多的开发者对RocketMQ的底层实现产生了浓厚的兴趣。本文将深入剖析RocketMQ的消息传递奥秘,帮助大家了解RocketMQ的底层实现原理,进一步掌握…...
Protocol https not supported or disabled in libcurl
原因 curl默认安装完后是只支持http协议而不支持https协议的。 curl -V查看当前curl支持哪些协议: [rootlocalhost /]# curl -V curl 7.19.4 (x86_64-unknown-linux-gnu) libcurl/7.19.4 OpenSSL/1.0.2k zlib/1.2.11 Protocols: tftp ftp telnet dict http fil…...
一步步搭建基于 ts + express + prisma + mongodb + zod 后端服务
环境: windows11、node 18.16.0 、pnpm 1、在合适位置,代开 vscode , 终端执行 mkdir miaooo-backend && cd miaooo-backend && npm init -y 。 创建一个名为一个 miaooo-backend 的项目,并且进入项目 执行 npm 默认初始化。…...
深入理解深度学习——Transformer:编码器(Encoder)部分
分类目录:《深入理解深度学习》总目录 Transformer中的编码器不止一个,而是由一组 N N N个编码器串联而成。一个编码器的输出作为下一个编码器的输入。在下图中有 N N N个编码器,每一个编码器都从下方接收数据,再输出给上方。以此…...
【图像处理】基于收缩系数的粒子群优化和引力搜索算法的多级图像阈值研究【CPSOGSA】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
PortSwigger web缓存中毒(Cache Poisoning)
一、什么web缓存中毒? Web缓存中毒(Web Cache Poisoning)是一种攻击技术,攻击者通过操纵Web应用程序的缓存系统,将恶意或欺骗性内容注入到合法的缓存中,以欺骗用户或绕过安全控制。 Web缓存中毒的原理是利用…...
msf渗透练习-生成木马控制window系统
说明: 本章内容,仅供学习,不要用于非法用途(做个好白帽) (一)生成木马 命令: msfvenom -p windows/meterpreter/reverse_tcp LHOST192.168.23.46 LPORT4444 -e x86/shikata_ga_nai -…...
【c++】组合类+继承情况下构造顺序
组合类继承情况下构造顺序 构造顺序同普通继承,先父后子,内部类是最老的(最先调用构造的)。 示例代码 class A { public:A(int a 0):_a(a){cout << "A()" << endl;}~A(){cout << "~A()" …...
盛元广通生物化学重点实验室化学品信息化安全管理系统
生物化学重点实验室是国家基础研究和高技术研究的重要基地,是培养和造就高层次创新型人才的重要基地。为保障实验室化学品安全使用,实验人员可通过现场或移动端管理系统实现化学品安全使用与存储。盛元广通生物化学重点实验室化学品信息化安全管理系统具…...
1.知识积累
(1)build_chain.sh 脚本: build_chain.sh 脚本是 FISCO BCOS 提供的一个工具脚本,用于自动化构建 FISCO BCOS 联盟链。它可以帮助您快速搭建和配置多节点的区块链网络。 具体而言,build_chain.sh 脚本的作用包括以下…...
20230612----重返学习-函数式编程-数据类型检测-网络层优化
day-090-ninety-20230612-函数式编程-数据类型检测-网络层优化 函数式编程 函数式编程 && 命令式编程 函数式编程:把具体的操作过程“封装”到一个函数中,我们无需关注内部是如何处理的(How),只需要关注处理的结果(What)即可; // 如果是依次迭代数组每一项,…...
Java实现删除txt第一行
如果您的文件很大,则可以使用以下方法在不使用临时文件或将所有内容加载到内存中的情况下执行删除. public static void removeFirstLine(String fileName) throws IOException { RandomAccessFile raf new RandomAccessFile(fileName, "rw"); …...
Go语言函数式编程库samber/lo
Go语言函数式编程库samber/lo 开发中,我们经常遇到一些操作,比如获取一个map的所有key,所有value,判断一个字符串是否出现在slice 中,slice中是否有重复元素等等。Go语言没有这样的操作,标准库也不提供。…...
自定义杰理AC63系列BLE数据发送函数
自定义BLE数据发送函数,就是将数据发送、数据发送前的检查、以及conn_handle查询等封装在一起,脱离SDK中的相关回调函数,在程序任意位置实现发送数据功能。 1. SDK中的BLE数据发送函数 BLE的数据发送函数定义在apps\common\third_party_pro…...
Jenkins结合gitee自动化部署SpringBoot项目
安装 安装教程 插件选择 Gitee Plugin 配置 源码管理 填写源码地址 注意:请确保genkins所在的服务器有权限git拉取远程仓库代码,如果不可以请参考ssh配置centos 配置ssh拉取远程git代码 源码管理 构建触发器 1.勾选Gitee webhook 触发构建 2.生成we…...
声强级和声压级之间的转换举例
声强级和声压级之间的转换举例 在学习声学时候,经常会遇到声强级和声压级的概念,而且它们的单位都是分贝(dB),很容易混淆这两个概念。而且,更容易在计算时候,不知如何转换,如何使用,本文将举例说明两者之间…...
16 粒子滤波
文章目录 16 粒子滤波16.1 背景介绍16.1.1 Particle Filter是什么?16.1.2 Patricle Filter的状态如何转移?16.1.3 如何通过采样求解Particle Filter 16.2 重要性采样16.2.1 重要性采样方法16.2.2 Sequential Importance Sampling16.2.3 Resampling16.2.4…...
【appium】appium自动化入门之API(下)——两万字API长文,建议收藏
目录 Appium API 前言 1.contexts (返回当前会话中的上下文,使用后可以识别 H5 页面的控件) 2.current_context (返回当前会话的当前上下文 ) 3. context (返回当前会话的当前上下文) 4.find_e…...
开发改了接口,经常忘通知测试的解决方案!
目录 前言: Apifox解决方案 Apifox对此给出的解决方案是: 用Apifox怎么处理接口变更 接口代码实现逻辑修改 接口参数修改 前言: 在开发过程中,接口变动十分频繁,测试人员没有及时获得相关通知的情况也很普遍。这…...
Beyond Compare 4 无法打开
解决办法: 1.修改注册表。WINR呼出开始菜单,在搜索栏中输入 regedit,点击确定。 2.删除项目:\HKEY_CURRENT_USER\Software\ScooterSoftware\Beyond Compare 4\CacheId 根据这个路径找到cacheid 右击删除掉就可以...
MySQL高级数据操作
✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:MySQL 🥭本文内容&a…...
硬件设计电源系列文章-DCDC转换器基础知识
文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 本文主要接着上篇,上篇文章主要讲述了LDO的相关基础知识,本节开始分享DCDC基础知识 整体架构流程 提示:这里可以添加技术整体架构 以下是…...
XdsObjects .NET 8.45.1001.0 Crack
XdsObjects 是一个工具包,允许开发人员使用 IHE XDS 和 XDS-I 配置文件开发应用程序,只需花费最少的时间和精力,因为遵守配置文件和 ebXML 规则的所有艰苦工作都由该工具包处理。 它为所有角色提供客户端和服务器支持,包括&#…...
数据安全--17--数据安全管理之数据传输
本博客地址:https://security.blog.csdn.net/article/details/131061729 一、数据传输概述 数据传输有两个主体,一个是数据发送方,另一个是数据接收方。数据在通过不可信或者较低安全性的网络进行传输时,容易发生数据被窃取、伪…...
SpringSecurity实现前后端分离登录token认证详解
目录 1. SpringSecurity概述 1.1 权限框架 1.1.1 Apache Shiro 1.1.2 SpringSecurity 1.1.3 权限框架的选择 1.2 授权和认证 1.3 SpringSecurity的功能 2.SpringSecurity 实战 2.1 引入SpringSecurity 2.2 认证 2.2.1 登录校验流程 2.2.2 SpringSecurity完整流程 2.2.…...
Vue3_ElementPlus_简单增删改查(2023)
Vue3,Element Plus简单增删改查 代码:https://github.com/xiaoming12318/Vue3_ElementPlus_CRUD.git 环境: Visual Studio Code Node.js 16.0或更高版本,https://nodejs.org/en axios 快速上手: 如果已经有16.0及…...
vue中重写并自定义console.log
0. 背景 在vue2项目中自定义console.log并输出文件名及行、列号 1. 实现 1.1 自定义console.log export default {// 输出等级: 0-no, 1-error, 2-warning, 3-info, 4-debug, 5-loglevel: 5,// 输出模式: 0-default, 1-normal, 2-randommode: 1,// 是否输出图标hasIcon: fal…...
郑州网站推广哪家专业/一站式推广平台
1.基本知识: 1.1solr的安装 1.2solr的基本使用 1.3solrj的使用 2.solr 实现全文检索 索引流程:客户端---》solr 服务器(发送post请求,xml文档包含filed,solr实现对索引的维护) 搜索流程:客户端---》solr 服务器(发送get 请求&…...
天河网站建设报价/如何在百度搜索到自己的网站
目录 一、面向对象的初步认识 1.1什么是面向对象 1.2面向对象与面向过程 二、类的定义和使用...
自己视频怎么上传网站/网络营销的背景和意义
我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置&a…...
bilibili推广网站/诊断网站seo现状的方法
文章目录一、使用idea构建项目二、项目结构三、编写第一个程序Hello World四、配置项目的热部署五、单元测试一、使用idea构建项目 1、选择 File -> New —> Project… 弹出新建项目的框 2、选择 Spring Initializr,Next 也会出现上述类似的配置界面…...
如何解析到凡科建设的网站/国际新闻快报
// -------------------- UISlider (滑块控件 是一个滑杆 存放着一系列的值) // UISlider *slider [[UISlider alloc]initWithFrame:CGRectMake(30, 100, 300, 30)]; // 设置滑块的显示图片 [slider setThumbImage:[UIImage imageNamed:"1.png"] forSta…...
网站建设的经济效益/广告网络推广
hive在创建表时默认存储格式是textfile,或者显示自定义的stored as textfile。 很多人知道hive常用的存储格式有三种,textfile,sequencefile,rcfile,但是却说不清楚这三种格式的干什么用的,本质有有什么区别?适合什么时候用&…...