在这篇文章中,我们将为您详细介绍oracle遍历查询,列转行的内容,并且讨论关于oracle查询结果列转行的相关问题。此外,我们还会涉及一些关于C#DataTable行转列列转行同时转换、ETL工具-
在这篇文章中,我们将为您详细介绍oracle 遍历查询,列转行的内容,并且讨论关于oracle 查询结果列转行的相关问题。此外,我们还会涉及一些关于C# DataTable 行转列 列转行 同时转换、ETL 工具 - KETTLE 教程 实例实战 4---- 转换(值映射、列转行,增加常量、增加序列等)、Hive-explode[列转行]关键字使用、hive操作(行转列,列转行)的知识,以帮助您更全面地了解这个主题。
本文目录一览:- oracle 遍历查询,列转行(oracle 查询结果列转行)
- C# DataTable 行转列 列转行 同时转换
- ETL 工具 - KETTLE 教程 实例实战 4---- 转换(值映射、列转行,增加常量、增加序列等)
- Hive-explode[列转行]关键字使用
- hive操作(行转列,列转行)
oracle 遍历查询,列转行(oracle 查询结果列转行)
--列合并
--wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行
--dbms_lob.substr 将clob转字符串
-- start with.....connect by ..=prior.. 遍历查询所有子节点的父节点
select dbms_lob.substr(wm_concat(name)) as name
from (select name
from table where type=''abc''
start with id= ''6208bcb7:164c70cf84d:-7fce''
connect by id= prior pid
order by levelno)
C# DataTable 行转列 列转行 同时转换
需求:数据库数据都是纵向的,呈现的时候要求是横向(列转行)同时看到行头(行转列)。
分析:很多报表呈现都要求要这样显示,用类是可以实现,但是代码多,又需要建很多dto。发下Excel有转置功能,但又不想牵扯Excel这一套组件。就使用DataTable来实现,代码也不多。
先看看示例数据3列10行:
我们要把它转成3行10列,列转行,行转列同时完成:
百度上有不少转换方案,都不尽如意。基本都是一个方向的转换。要么是行转列,要么是列转行。干脆就自己写了一个。
因为行转列,列转行要同时进行,我们需要仔细观察数据,打个下标来观察。
先把数据归类为二维数组,从转换后的表倒推回去,发现:
结果表的是【1,1】是原始表的【1,1】.
结果表的【1,2】是原始表的【2,1】,类推结果表【1,3】是原始表【3,1】
规律:下标对调就可以得到转换表
代码实现:
1、把源数据(包含列头)转换成二维数组,然后下标对调。这种方法使用最方便。就是要仔细算下标位置,应为列头加进去了
private DataTable PivotDatatable(DataTable dtSource, string columnFilter)
{
var columns = columnFilter.Split('','');
DataTable dtFilter = dtSource.DefaultView.ToTable(false, columns);
DataTable dtResult = new DataTable();
var rowCount = dtFilter.Rows.Count;
var columnCount = columns.Length;
// 源数组的行数比DataTable的行数+1,, 加一行表头
object[,] arrSource = new object[rowCount + 1, columnCount];
// 目标数组的行数等于选择的列数,列数等于 源数据的行数+1, 加一列 属性名
object[,] arrResult = new object[columnCount, rowCount + 1];
// 原数组第一行写表头
for (int i = 0; i < columnCount; i++)
{
arrSource[0, i] = dtFilter.Columns[i].ColumnName;
}
// 源数据 每一行写 数据
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
arrSource[i + 1, j] = dtFilter.Rows[i][j];
}
}
// 原数 转置到 目标数组
for (int i = 0; i < rowCount + 1; i++)
{
for (int j = 0; j < columnCount; j++)
{
arrResult[j, i] = arrSource[i, j];
}
}
// 创建 Datatable 的结构
for (int i = 0; i < rowCount + 1; i++)
{
dtResult.Columns.Add(arrResult[0, i].ToString());
}
List<string> valueList = new List<string>();
for (int i = 1; i < columnCount; i++)
{
for (int j = 0; j < rowCount + 1; j++)
{
valueList.Add(arrResult[i, j].ToString());
}
dtResult.Rows.Add(valueList.ToArray());
valueList.Clear();
}
return dtResult;
}
2、思路是数据转换成二维码(不含列头),转换完成后,再把列头加入到新的table里面,不需要过多算下标
private DataTable SwapTable(DataTable tableData)
{
int intRows = tableData.Rows.Count;
int intColumns = tableData.Columns.Count;
//转二维数组
string[,] arrayData = new string[intRows, intColumns];
for (int i = 0; i < intRows; i++)
{
for (int j = 0; j < intColumns; j++)
{
arrayData[i, j] = tableData.Rows[i][j].ToString();
}
}
//下标对换
string[,] arrSwap = new string[intColumns, intRows];
for (int m = 0; m < intColumns; m++)
{
for (int n = 0; n < intRows; n++)
{
arrSwap[m, n] = arrayData[n, m];
}
}
DataTable dt = new DataTable();
//添加列
for (int k = 0; k < intRows; k++)
{
dt.Columns.Add(
new DataColumn(arrSwap[0, k])
);
}
//添加行
for (int r = 1; r < intColumns; r++)
{
DataRow dr = dt.NewRow();
for (int c = 0; c < intRows; c++)
{
dr[c] = arrSwap[r, c].ToString();
}
dt.Rows.Add(dr);
}
//添加行头
DataColumn ColRowHead = new DataColumn(tableData.Columns[0].ColumnName);
dt.Columns.Add(ColRowHead);
dt.Columns[ColRowHead.ColumnName].SetOrdinal(0);
for (int i = 0; i < intColumns - 1; i++)
{
dt.Rows[i][ColRowHead.ColumnName] = tableData.Columns[i + 1].ColumnName;
}
return dt;
}
ETL 工具 - KETTLE 教程 实例实战 4---- 转换(值映射、列转行,增加常量、增加序列等)
接着上一讲,讲完了常用的输入、输出控件后,这一节我们来讲下常用的转换控件,如下图:
3、转换
3.1 值映射:将一个数据流的内容,转换成另外的数据流,并输出。作用如同 sql 语句中的 decode 函数。
此处用到三个控件,表输入、表输出(可以参考前面的内容)和值映射。三个控件用 hop 线进行连接。
双击值映射,如上图所示配置好相应的源值和目标值,通过连线从 A 表连接到 B 表。运行结果如下:
3.2 列转行:将二维数据流的其中 1 列数据,转换为行(也就是列转换为行的表头),在根据关键字段进行展示。
此处用到两个控件,表输入(可以参考前面的内容)和列转行。两个控件用 hop 线进行连接。
双击列转行,如上图所示配置好关键字段、构成分组的字段和目标字段。运行结果如上图步骤 4。
3.3 剪切字符串:如同各种数据库的 substr 函数,用处不大可以忽略。
3.4 去除重复记录:根据某个字段进行剔重,类似于 sql 语句中的 distinct
此处用到两个控件,表输入(可以参考前面的内容)和去除重复记录。两个控件用 hop 线进行连接。
表输入需要先按照比较字段进行排序,如上图所示配置好计数器字段和用来比较的字段。运行结果如上图步骤 3
3.5 增加常量、增加序列:增加常量和增加数据库序列
如上图所示,配置好常量值和序列值,即可生成
3.6 字段选择:将上一步骤数据流中的数据进行格式转换(主要用于时间的转换)
此处用到两个控件,表输入(可以参考前面的内容)和字段选择。两个控件用 hop 线进行连接。
表输入中存在包含时间的字段(可以看到不是按照标注的日期时间格式输出),如下左图,选择 cjsj 时间进行转换候。运行结果如下右图:
3.7 字符串操作:如同各种数据库的各种字符串处理函数,用处不大可以忽略
3.8 字符串替换:如同各种数据库的 replace 函数,用处不大可以忽略
3.9 拆分字段:如同各种数据库的 split 函数,将字段按照分隔符拆分成多个字段
此处用到两个控件,表输入(可以参考前面的内容)和拆分字段。两个控件用 hop 线进行连接。
拆分字段选择需要拆分的字段、分隔符、和拆分后的字段,点击运行。运行结果如下图:
接着上一讲,讲完了常用的转换控件后,接下来我们来讲下常用的应用控件,如下图:
4、转换
4.1 写日志 可以通过写日志,将上一个数据流中日志信息打印出来,可以设置具体的日志级别
如上图所示,配置好日志头信息,设置好日志级别,打印相应的日志
往期文章:
- ETL 工具 - KETTLE 教程实例实战 3---- 转换
欢迎关注公众号,回复 “教程” 获取程序源代码,获取例子源码,扫描下方二维码加关注
Hive-explode[列转行]关键字使用
本文讨论 Hive explode 关键字使用, 并使用一个简单案例来验证结果.
Hive 支持 array 和 map 类型, 但是如何统计 array 或 map 里的值, 一直没有找到好的方法. Pig 有行转列关键字 flatten. 查阅了很多 Hive 资料, 找到了 explode 关键字. 谨以此例来验证 Hive explode 功能.
hive> create table if not exists explode_array
> (
> userId string,
> userName string,
> tags array<string>
> )
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ''\t''
> COLLECTION ITEMS TERMINATED BY '','';
OK
Time taken: 0.942 seconds
数据样例:
00001 zhzhenqin 80,90
00002 hello java, 女
00003 world java,python,90
查询:
hive> select * from explode_array limit 10;
OK
00001 zhzhenqin ["80","90"]
00002 hello ["java"," 女"]
00003 world ["java","python","90"]
Time taken: 0.041 seconds, Fetched: 3 row(s)
使用 explode 查询:
hive> select userId,userName,tagId from explode_array lateral view explode(tags) tags as tagId;
Total jobs = 1
... 省略部分日志
Total MapReduce CPU Time Spent: 0 msec
OK
00001 zhzhenqin 80
00001 zhzhenqin 90
00002 hello java
00002 hello 女
00003 world java
00003 world python
00003 world 90
Time taken: 20.104 seconds, Fetched: 7 row(s)
二次嵌套查询, 并统计:
hive> select user_tag.tagId, count(*) as count from (select userId,userName,tagId from explode_array lateral view explode(tags) tags as tagId) as user_tag group by user_tag.tagId order by count DESC;
Total jobs = 2
... 省略日志
Total MapReduce CPU Time Spent: 0 msec
OK
java 2
90 2
python 1
80 1
女 1
Time taken: 39.994 seconds, Fetched: 5 row(s)
该例子是使用 array 类型, 我们的用户和标签在 Hive 存储的是 map 类型, Map 的 key 为 tagid, value 为 weight. explode 也是支持 map 类型的.
explode 在转 array 时, 输出一列; 转 map 时, 是输出2列, key 和 value 当做 2列输出.
下面演示 Map 类型的 explode 用法:
建表语句, 以及导入的数据
create table if not exists explode_map
(
userId string,
userName string,
tags map<string, int>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ''\t''
COLLECTION ITEMS TERMINATED BY '',''
MAP KEYS TERMINATED BY '':'';
数据
00001 zhzhenqin 80:1,90:2
00002 hello java:10,女:2
00003 world java:1,python:3,90:1
查询验证:
hive> select * from explode_map;
OK
00001 zhzhenqin {"80":1,"90":2}
00002 hello {"java":10,"女":2}
00003 world {"java":1,"python":3,"90":1}
Time taken: 0.04 seconds, Fetched: 3 row(s)
使用 explode 关键字查询:
hive>select userId,userName,tagId,weight from explode_map lateral view explode(tags) tags as tagId, weight;
00001 zhzhenqin 80 1
00001 zhzhenqin 90 2
00002 hello java 10
00002 hello 女 2
00003 world java 1
00003 world python 3
00003 world 90 1
内嵌查询及统计:
hive> select user_tag.tagId, count(*) as count from (select userId,userName,tagId,weight from explode_map lateral view explode(tags) tags as tagId, weight) as user_tag group by user_tag.tagId order by count DESC;
java 2
90 2
女 1
python 1
80 1
hive操作(行转列,列转行)
一、行转列
1.相关函数说明
CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;
CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
2.数据准备
孙悟空 白羊座 A
大海 射手座 A
宋宋 白羊座 B
猪八戒 白羊座 A
凤姐 射手座 A
3.需求
把星座和血型一样的人归类到一起。结果如下:
射手座,A 大海|凤姐
白羊座,A 孙悟空|猪八戒
白羊座,B 宋宋
4.创建表并导入数据
create table person_info(
name string,//姓名
constellation string,//星座
blood_type string)//血型
row format delimited fields terminated by "\t";
load data local inpath "/home/hadoop/file/ person_info" into table person_info;//导入数据到数据库
5.
select
>
> t1.base,
>
> concat_ws(''|'', collect_set(t1.name)) name//拼接名字
>
> from
>
> (select
>
> name,
>
> concat(constellation, ",", blood_type) base//拼接星座血型
>
> from
>
> person_info) t1//设置表别名
>
> group by
>
> t1.base;
6.结果截图
二、列转行
1.函数说明
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
2.数据准备
《疑犯追踪》 悬疑,动作,科幻,剧情
《Lie to me》 悬疑,警匪,动作,心理,剧情
《战狼2》 战争,动作,灾难
3.需求
将电影分类中的数组数据展开。结果如下:
《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《Lie to me》 悬疑
《Lie to me》 警匪
《Lie to me》 动作
《Lie to me》 心理
《Lie to me》 剧情
《战狼2》 战争
《战狼2》 动作
《战狼2》 灾难
4.创建数据库并且导入数据
create table movie_info(
movie string,
category array<string>)
row format delimited fields terminated by "\t"
collection items terminated by ",";‘
load data local inpath "/home/hadoop/file/movie_info" into table movie_info;//讲数据导入到数据库
5.按需求查询
select
>
> movie,
>
> category_name
>
> from
>
> movie_info lateral view explode(category) table_tmp as category_name;
6.显示结果
今天关于oracle 遍历查询,列转行和oracle 查询结果列转行的分享就到这里,希望大家有所收获,若想了解更多关于C# DataTable 行转列 列转行 同时转换、ETL 工具 - KETTLE 教程 实例实战 4---- 转换(值映射、列转行,增加常量、增加序列等)、Hive-explode[列转行]关键字使用、hive操作(行转列,列转行)等相关知识,可以在本站进行查询。
本文标签: