Hadoop 使用Pivot的Pivot输入
我需要你的帮助在下面的情况下(使用猪拉丁语) 我有以下格式的输入数据:Hadoop 使用Pivot的Pivot输入,hadoop,pivot,apache-pig,Hadoop,Pivot,Apache Pig,我需要你的帮助在下面的情况下(使用猪拉丁语) 我有以下格式的输入数据: DATE,ERROR,COUNT 20110212,ORA-00600,9 20110212,ORA-03135,1 20110226,ORA-20000,1 20110305,ORA-03135,1 20110319,ORA-01555,1 20110319,ORA-03135,18 20110326,ORA-00600,1 20110409,ORA-00600,1 20110416,ORA-20000,1 2011042
DATE,ERROR,COUNT
20110212,ORA-00600,9
20110212,ORA-03135,1
20110226,ORA-20000,1
20110305,ORA-03135,1
20110319,ORA-01555,1
20110319,ORA-03135,18
20110326,ORA-00600,1
20110409,ORA-00600,1
20110416,ORA-20000,1
20110423,ORA-01555,2
20110507,ORA-00600,1
20110507,ORA-01555,2
20110514,ORA-00600,1
20110514,ORA-03135,4
我正在寻找如下输出
DATE,ORA-00600,ORA-03135,ORA-20000....
20110212,9,1,0....
20110514,1,4,0...
20110416,0,0,1...
基本上,我是在关注输入数据;我不能使用嵌套的FOREACH(带过滤器),因为错误代码(如ORA-00600、ORA-03135…)不是常量,而是动态的
请提出建议。我并不惊讶有多少关于SQL中的PIVOT功能的问题被问到。我也有一些项目需要使用PIVOT结果。电子表格是一个完美的例子(也是企业IT界的一个巨大需求) 数据透视表非常好,但如果您像我一样在动态制造环境中工作,它们通常会变得繁琐和复杂。在这类领域,需求总是主观的。并且可能导致程序员从根本上拔出头发 正是出于这个原因,我决定在DataTable对象上创建一个扩展,它生成一个PIVOT表,我发现它既快速又有用 是的,我知道SQL版本,并且仍然知道有一些方法可以使SQL中的PIVOT更加动态(用于更改列)。但我已经学会了让事情简单化。简单带来了稳定性、可用性、可扩展性和可伸缩性。。在现实的企业世界中,这些都是巨大的好处 我现在和你们分享这个,希望你们能修改它来满足你们的需要。它是动态的,速度非常快。。最简单的是
/// <summary>
/// Creates a PIVOT table based on values in existing table
/// </summary>
/// <param name="PKey">Field used as PIVOT tables Primary (row) Key.</param>
/// <param name="FKey">Field used to create unique column names in PIVOT table.</param>
/// <param name="VKey">Field used as the value for each associated column in a PIVOT table record.</param>
/// <returns>DataTable</returns>
public static DataTable Pivot(this DataTable tbl, string PKey, string FKey, string VKey)
{
DataTable retVal = null;
DataTable keyTbl = null;
DataTable fldTbl = null;
DataColumn dc = null;
DataRow newRow = null;
Type pkType = null;
Type valType = null;
string strPkeyFilter = null;
string prevFilter = null;
try
{
// Get previous filter (save)
prevFilter = tbl.DefaultView.RowFilter;
if (tbl.Rows.Count > 0)
{
// Get unique Primary Keys and Field Names
keyTbl = tbl.DefaultView.ToTable(true, PKey);
fldTbl = tbl.DefaultView.ToTable(true, FKey);
if (fldTbl.Rows.Count > 0)
{
// Get Primary Key data type and create column on Pivot table.
pkType = tbl.Columns[PKey].DataType;
retVal = new DataTable(tbl.TableName);
retVal.Columns.Add(new DataColumn(PKey, pkType));
retVal.PrimaryKey = new DataColumn[] { retVal.Columns[PKey] };
// Get VALUE columns data type
valType = tbl.Columns[VKey].DataType;
// Create Primary Key filter
strPkeyFilter = "{0} = {1}";
if(pkType.Equals(typeof(string)))
strPkeyFilter = "{0} = '{1}'";
foreach (DataRow dr in fldTbl.Rows)
{
// Create additional rows in Pivot table based on unique Field Names
dc = new DataColumn(Convert.ToString(dr[FKey]), valType);
dc.AllowDBNull = true;
dc.DefaultValue = DBNull.Value;
retVal.Columns.Add(dc);
}
// Iterate through Primary Key collection
foreach (DataRow dr in keyTbl.Rows)
{
// Set Primary Key row filter on base table
tbl.DefaultView.RowFilter = string.Format(strPkeyFilter, PKey, dr[PKey]);
if (tbl.DefaultView.Count > 0)
{
// Create new row on Pivot table and set Primary Key
newRow = retVal.NewRow();
newRow[PKey] = dr[PKey];
// Iterate through records and find VALUE for each FIELD column
foreach (DataRowView drv in tbl.DefaultView)
newRow[Convert.ToString(drv[FKey])] = drv[VKey];
retVal.Rows.Add(newRow);
}
}
// Return previous row filter on base table
tbl.DefaultView.RowFilter = prevFilter;
// Commit chages to Pivot table (if any)
retVal.AcceptChanges();
}
}
}
catch (Exception)
{
throw;
}
finally
{
if (keyTbl != null)
keyTbl.Dispose();
if (fldTbl != null)
fldTbl.Dispose();
}
return retVal;
}
因此,如果myTbl的布局如下所示:
DOC_ID | ENTRY_DATE | UI_FIELD | UI_CAPTION | UI_VALUE
----------------------------------------------------------------
1 01/01/2015 EMPL_NAME Empl. Name John Doe
1 01/01/2015 EMPL_PHONE Empl. Phone 801-555-1212
1 01/01/2015 EMPL_MNGR Empl. Mangr. Jane Doe
它将返回:
DOC_ID | ENPL_NAME | EMPL_PHONE | EMPL_MNGR
-------------------------------------------------
1 John Doe 801-555-1212 Jane Doe
在垂直行中布局UI条目数据的好处(无论如何,在制造环境中)是更好地适应UI字段的增加或减少。。这经常发生!因为您最不想做的事情就是修改数据模式。尤其是当大约一百个(已知和未知)应用程序也在使用它时
无论如何,不管它值多少钱,我希望这能引导你朝着理想的方向前进。我经常使用这个问题。看起来以前也有人问过类似的问题。看看alexeipab,它与之类似,但在本例中,在旋转时列的数量不是预定义的。。
DOC_ID | ENPL_NAME | EMPL_PHONE | EMPL_MNGR
-------------------------------------------------
1 John Doe 801-555-1212 Jane Doe