Scala: использование функции spark sql при выборе столбца в кадре данных - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть две таблицы / фрейма данных: A и B

A имеет следующие столбцы: cust_id, purch_date

B имеет один столбец: cust_id, col1 (col1 ненеобходимо)

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

Table A
cust_id  purch_date
  34564  2017-08-21
  34564  2017-08-02
  34564  2017-07-21
  23847  2017-09-13
  23423  2017-06-19


Table B
cust_id  col1
  23442     x
  12452     x
  12464     x  
  23847     x
  24354     x

Я хочу выбрать cust_id и первый день месяца purch_date, где выбранные cust_id не являютсятам в B.

Это может быть достигнуто в SQL с помощью следующей команды:

select a.cust_id, trunc(purch_date, 'MM') as mon
from a
left join b
on a.cust_id = b.cust_id
where b.cust_id is null
group by cust_id, mon;

Ниже будет вывод:

Table A
cust_id  purch_date
  34564  2017-08-01
  34564  2017-07-01
  23423  2017-06-01

Я пробовал следующеечтобы реализовать то же самое в Scala:

import org.apache.spark.sql.functions._

a = spark.sql("select * from db.a")
b = spark.sql("select * from db.b")

var out = a.join(b, Seq("cust_id"), "left")
           .filter("col1 is null")
           .select("cust_id", trunc("purch_date", "month"))
           .distinct()

Но я получаю разные ошибки, такие как:

error: type mismatch; found: StringContext required: ?{def $: ?}

Я застрял здесь и не смог найти достаточно документации / ответов в сети.

1 Ответ

0 голосов
/ 23 февраля 2019

Select должен содержать Columns вместо Strings:

Ввод:

df1:
+-------+----------+
|cust_id|purch_date|
+-------+----------+
|  34564|2017-08-21|
|  34564|2017-08-02|
|  34564|2017-07-21|
|  23847|2017-09-13|
|  23423|2017-06-19|
+-------+----------+    

df2:
+-------+----+
|cust_id|col1|
+-------+----+
|  23442|   X|
|  12452|   X|
|  12464|   X|
|  23847|   X|
|  24354|   X|
+-------+----+

Измените ваш запрос следующим образом:

df1.join(df2, Seq("cust_id"), "left").filter("col1 is null")
.select($"cust_id", trunc($"purch_date", "MM"))
.distinct()
.show()

Вывод:

+-------+---------------------+
|cust_id|trunc(purch_date, MM)|
+-------+---------------------+
|  23423|           2017-06-01|
|  34564|           2017-07-01|
|  34564|           2017-08-01|
+-------+---------------------+
...