使用Google Big Query为电子表格使用组织边缘列表

我在尝试重新组织一个从Gephi导出为.csv的大型边界列表时遇到了问题。

数据的结构是:

  • 两栏,“来源”和“目标”。
  • “来源”包含用户ID,“目标”包含城市,国家和大学等人口统计信息。
  • 由于数据的结构,如果用户具有多个人口统计logging,则可以在“来源”中复制用户。

例如:

Source Target user142 cityA user532 countryA user352 cityC user532 cityA user143 countryC user532 university1 

我希望的输出是为每个独特的用户定位在他们自己的行上,并为“城市”,“国家”和“大学”分开列 – 像这样:

 Unique User City Country University user142 CityA user532 CityA CountryA University1 user352 CityC user143 CountryC 

我已经能够使用以下索引,匹配和数组公式在Excel中将边列表分隔为所需的输出。 然而,这是漫长的,而且当涉及大型边界列表时,Excel经常崩溃。

Excel过程:

步骤1:

 =INDEX($A$2:$A$5819, MATCH(0, COUNTIF($D$1:$D1, $A$2:$A$5819), 0)) 

这将筛选所有用户的唯一logging(colA)并将它们放置在新列(colD)中。

第2步:

 =ArrayFormula(IFERROR(INDEX($B$2:$B$174, MATCH(0, COUNTIF($D2:D2,$B$2:$B$174)+IF($A$2:$A$174<>$D2, 1, 0), 0)), 0)) 

这将在步骤1(colD)中创build的列中查找“目标”列(B)。 但是,这不会在列之间输出。 所以从左到右可以为每个独特的用户阅读城市,国家,大学,或国家,大学,城市等。

第3步:

 =transpose(sort(transpose(E2:H2))) 

这一步然后按照字母顺序排列输出,所以左右列读取城市,国家,大学。

我的主要问题是这是一个缓慢和手动的过程,所以我正在寻求在Big Query中使用SQL来使这个stream程尽可能高效。

任何有关如何开始构build查询将数据分类到所需输出的信息将不胜感激。

我已经有一些SQL的经验,但这主要是在文本提取和正则expression式方面。

谢谢!

在BigQuery中,您可以使用条件聚合来完成此操作。 它看起来像这样:

 select source, max(case when type = 'City' then target end) as city, max(case when type = 'Country' then target end) as country, max(case when type = 'University' then target end) as university from demographics d group by source; 

你的问题没有指定type的列。 但是,如果你有不同types的信息,似乎你需要一个。

正如Gordon评论的那样,您可以使用ARRAY_AGG将所有这些信息汇总在一起。 例:

 #standardSQL SELECT Source, ARRAY_AGG(IF(REGEXP_CONTAINS(Target, r'^ci'), Target, NULL) IGNORE NULLS) City, ARRAY_AGG(IF(REGEXP_CONTAINS(Target, r'^co'), Target, NULL) IGNORE NULLS) Country, ARRAY_AGG(IF(REGEXP_CONTAINS(Target, r'^uni'), Target, NULL) IGNORE NULLS) Universiry FROM `your_table` GROUP BY Source 

使用模拟数据:

 #standardSQL WITH data AS( SELECT 'user142' AS Source, 'cityA' AS Target UNION ALL SELECT 'user532', 'countryA' UNION ALL SELECT 'user 352', 'cityC' UNION ALL SELECT 'user532', 'cityA' UNION ALL SELECT 'user143', 'countryC' UNION ALL SELECT 'user532', 'university1' UNION ALL SELECT 'user532', 'cityB' ) SELECT Source, ARRAY_AGG(IF(REGEXP_CONTAINS(Target, r'^ci'), Target, NULL) IGNORE NULLS) City, ARRAY_AGG(IF(REGEXP_CONTAINS(Target, r'^co'), Target, NULL) IGNORE NULLS) Country, ARRAY_AGG(IF(REGEXP_CONTAINS(Target, r'^uni'), Target, NULL) IGNORE NULLS) Universiry FROM data GROUP BY Source