Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Spark SQL数据仓库_Mysql_Sql_Pyspark Sql - Fatal编程技术网

Mysql Spark SQL数据仓库

Mysql Spark SQL数据仓库,mysql,sql,pyspark-sql,Mysql,Sql,Pyspark Sql,我有两个数据集,如下所示- 历史: +-------+-------+-----------+ |prod_id|prod_cd| prod_desc| +-------+-------+-----------+ | 42546|Firefox|Firefox 4.0| | 12432| Chrome| Chrome 1.0| +-------+-------+-----------+ 当前: +-------+-------+----------+ |prod_id|prod_cd|

我有两个数据集,如下所示-

历史:

+-------+-------+-----------+
|prod_id|prod_cd|  prod_desc|
+-------+-------+-----------+
|  42546|Firefox|Firefox 4.0|
|  12432| Chrome| Chrome 1.0|
+-------+-------+-----------+
当前:

+-------+-------+----------+
|prod_id|prod_cd| prod_desc|
+-------+-------+----------+
|  53243|     IE|    IE 2.0|
|  12432| Chrome|Chrome 1.5|
+-------+-------+----------+
我想对这两个表(dataframes)运行一个(spark)sql查询,并获取所有历史记录和新条目,其中两者之间的公共项将从最新的表中选取,并删除旧表(类似于更新相应的行)

所以,我的输出表应该是-

+-------+-------+-----------+
|prod_id|prod_cd|  prod_desc|
+-------+-------+-----------+
|  42546|Firefox|Firefox 4.0|
|  53243|     IE|     IE 2.0|
|  12432| Chrome| Chrome 1.5|
+-------+-------+-----------+
在第0天完成初始加载后,我在增量/增量加载期间执行了协调作业,但由于很长时间没有接触数据仓库,因此失去了清晰性


我需要在并集后使用秩函数吗?还是有更好/更快的方法?非常感谢您的帮助。

您可以将
不存在
联合使用

select prod_id, prod_cd, prod_desc
from Current c
union all
select prod_id, prod_cd, prod_desc
from Historical h
where not exists (select 1 from Current c1 where c1.prod_id = h.prod_id);
理解的分类词:

在前面的查询中,这将首先返回
当前
数据,然后在相关
子查询
的帮助下返回
历史
数据(即当前不存在的数据)


因此,这将返回两个结果集,这两个结果集通过集合运算符
UNION ALL
组合,以生成所需的结果

您可以将
不存在
联合使用

select prod_id, prod_cd, prod_desc
from Current c
union all
select prod_id, prod_cd, prod_desc
from Historical h
where not exists (select 1 from Current c1 where c1.prod_id = h.prod_id);
理解的分类词:

在前面的查询中,这将首先返回
当前
数据,然后在相关
子查询
的帮助下返回
历史
数据(即当前不存在的数据)


因此,这将返回两个结果集,这两个结果集通过集合运算符
UNION ALL
组合,以生成所需的结果

对于您发布的问题,使用rank没有意义,因为没有列指示行是新的。例如,时间戳

因此,对于您提到的情况,可以使用合并逻辑

您知道包含最新数据的表和包含历史数据的表。因此,您的逻辑应该是合并这两个表

下面是您可以在Spark SQL中执行的一种方法

select
case when(c.prod_id is null) then h.prod_id else c.prod_id end as prod_id,
case when(c.prod_id is null) then h.prod_cd else c.prod_cd end as prod_cd,
case when(c.prod_id is null) then h.prod_desc else c.prod_desc end as prod_desc
from historical h
full outer join current c on
h.prod_id = c.prod_id 
如果数据存在于当前中,它将从当前中提取,否则它将从历史中提取。我已加入主键“prod_id”上的表


希望这有帮助

对于您发布的问题,使用rank没有意义,因为没有列指示行是新的。例如,时间戳

因此,对于您提到的情况,可以使用合并逻辑

您知道包含最新数据的表和包含历史数据的表。因此,您的逻辑应该是合并这两个表

下面是您可以在Spark SQL中执行的一种方法

select
case when(c.prod_id is null) then h.prod_id else c.prod_id end as prod_id,
case when(c.prod_id is null) then h.prod_cd else c.prod_cd end as prod_cd,
case when(c.prod_id is null) then h.prod_desc else c.prod_desc end as prod_desc
from historical h
full outer join current c on
h.prod_id = c.prod_id 
如果数据存在于当前中,它将从当前中提取,否则它将从历史中提取。我已加入主键“prod_id”上的表


希望这有帮助

嘿,感谢您的快速回复,我想知道,内部查询在做什么,它只返回1的数量,这取决于常见产品id的数量。@AakashBasu。没有任何
内部查询
也许您正在谈论相关的
子查询
。是的,我错误地编写了内部查询。你能解释一下相关子查询的粒度吗?我的意思是,它只返回1的数量,这取决于公共产品id的数量。但是where条款在这里能保证什么呢?@AakashBasu。
where
子句确保在
Current
中可用的
prod\u id
Historical
匹配,现在
不存在
只需排除与
where
子句匹配的行或
prod\u id
。因此,它将重写为
存在(从当前c1中选择1,其中c1.prod_id h.prod_id)
因此,在联合历史部分时,它将避免对当前中存在的所有ID进行联合,因为这是优先级,对吗?谢谢嘿,感谢您的快速回复,我想知道,内部查询在做什么,它只返回1的数量,这取决于常见产品id的数量。@AakashBasu。没有任何
内部查询
也许您正在谈论相关的
子查询
。是的,我错误地编写了内部查询。你能解释一下相关子查询的粒度吗?我的意思是,它只返回1的数量,这取决于公共产品id的数量。但是where条款在这里能保证什么呢?@AakashBasu。
where
子句确保在
Current
中可用的
prod\u id
Historical
匹配,现在
不存在
只需排除与
where
子句匹配的行或
prod\u id
。因此,它将重写为
存在(从当前c1中选择1,其中c1.prod_id h.prod_id)
因此,在联合历史部分时,它将避免对当前中存在的所有ID进行联合,因为这是优先级,对吗?谢谢