Соединить таблицу с инкрементными данными той же таблицы - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь реализовать логику в Redshift Spectrum, где моя исходная таблица выглядит следующим образом:

Записи в таблице ученика:

1 || student1 || Boston   || 2019-01-01  
2 || student2 || New York || 2019-02-01
3 || student3 || Chicago  || 2019-03-01 
1 || student1 || Dallas   || 2019-03-01

Записи в таблице приращений studentinc выглядит следующим образом:ниже:

1 || student1 || SFO       || 2019-04-01
4 || student4 || Detroit   || 2019-04-01

Соединяя таблицы учеников и учеников, я пытаюсь получить последний набор записей, который должен выглядеть следующим образом:

2 || student2 || New York  || 2019-02-01
3 || student3 || Chicago   || 2019-03-01
1 || student1 || SFO       || 2019-04-01
4 || student4 || Detroit   || 2019-04-01

Я получил это решение отвыполняя UNION для студентов и студентов, затем запрашивая результат объединения на основе max (ified_ts). Однако это решение не подходит для больших таблиц, есть ли лучшее решение, которое работает, объединяя обе таблицы?

Ответы [ 2 ]

1 голос
/ 02 октября 2019

1. Используя Spark-SQL , вы можете добиться этого, используя регистр not in и union

scala> var df1 = Seq((1 ,"student1","Boston  " , "2019-01-01"  ),(2 ,"student2","New York" , "2019-02-01"),(3 ,"student3","Chicago " , "2019-03-01" ),(1 ,"student1","Dallas  " , "2019-03-01")).toDF("id","name","country","_date")

как временную таблицу

scala> df1.registerTempTable("temp1")
scala> sql("select * from temp1") .show
+---+--------+--------+----------+
| id|    name| country|     _date|
+---+--------+--------+----------+
|  1|student1|Boston  |2019-01-01|
|  2|student2|New York|2019-02-01|
|  3|student3|Chicago |2019-03-01|
|  1|student1|Dallas  |2019-03-01|
+---+--------+--------+----------+

2nd DataFrame

scala> var df3 = Seq((1 , "student1", "SFO", "2019-04-01"),(4 , "student4", "Detroit", "2019-04-01")).toDF("id","name","country","_date")

scala> df3.show
+---+--------+-------+----------+
| id|    name|country|     _date|
+---+--------+-------+----------+
|  1|student1|    SFO|2019-04-01|
|  4|student4|Detroit|2019-04-01|
+---+--------+-------+----------+

выполнение не в предложении объединения

scala> sql("select * from (select * from temp1 where id not in (select id from temp2 ) )tt") .union(df3).show
+---+--------+--------+----------+
| id|    name| country|     _date|
+---+--------+--------+----------+
|  2|student2|New York|2019-02-01|
|  3|student3|Chicago |2019-03-01|
|  1|student1|     SFO|2019-04-01|
|  4|student4| Detroit|2019-04-01|
+---+--------+--------+----------+

2-е использование Spark Dataframe это быстрее, чем запрос IN, потому что IN выполняет построчную операцию.

scala> df1.join(df3,Seq("id"),"left_anti").union (df3).show
+---+--------+--------+----------+
| id|    name| country|     _date|
+---+--------+--------+----------+
|  2|student2|New York|2019-02-01|
|  3|student3|Chicago |2019-03-01|
|  1|student1|     SFO|2019-04-01|
|  4|student4| Detroit|2019-04-01|
+---+--------+--------+----------+

Надеюсь, это поможет вам. дайте мне знать, если у вас есть запрос, связанный с тем же

0 голосов
/ 02 октября 2019

Я бы порекомендовал оконные функции:

select s.*
from (select s.*,
             row_number() over (partition by studentid order by date desc) as seqnum
      from ((select s.* from student
            ) union all
            (select i.* from incremental
             from incremental
            )
           ) s
     ) s
where seqnum = 1;

Примечание: union all требует, чтобы столбцы были точно такими же и в том же порядке. Возможно, вам придется перечислить столбцы, если они не совпадают.

...