Я бездельничаю с данными из Spark: Полное руководство и использую Java только для целей полной округлости.
Я хорошо читаю данные из CSV и создаю временныйпросмотреть таблицу следующим образом:
Dataset<Row> staticDataFrame = spark.read().format("csv").option("header","true").option("inferSchema","true").load("/data/retail-data/by-day/*.csv");
staticDataFrame.createOrReplaceTempView("SalesInfo");
spark.sql("SELECT CustomerID, (UnitPrice * Quantity) AS total_cost, InvoiceDate from SalesInfo").show(10);
Это работает нормально и возвращает следующие данные:
+----------+------------------+--------------------+
|CustomerID| total_cost| InvoiceDate|
+----------+------------------+--------------------+
| 14075.0| 85.92|2011-12-05 08:38:...|
| 14075.0| 25.0|2011-12-05 08:38:...|
| 14075.0|39.599999999999994|2011-12-05 08:38:...|
| 14075.0| 30.0|2011-12-05 08:38:...|
| 14075.0|15.299999999999999|2011-12-05 08:38:...|
| 14075.0| 40.8|2011-12-05 08:38:...|
| 14075.0| 39.6|2011-12-05 08:38:...|
| 14075.0| 40.56|2011-12-05 08:38:...|
| 18180.0| 17.0|2011-12-05 08:39:...|
| 18180.0| 17.0|2011-12-05 08:39:...|
+----------+------------------+--------------------+
only showing top 10 rows
У меня возникают проблемы при попытке сгруппировать его по CustomerID, однако при попыткесгруппировать его по CustomerID,
spark.sql("SELECT CustomerID, (UnitPrice * Quantity) AS total_cost, InvoiceDate from SalesInfo GROUP BY CustomerID").show(10);
Я получаю:
Exception in thread "main" org.apache.spark.sql.AnalysisException: expression 'salesinfo.`UnitPrice`' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() (or first_value) if you don't care which value you get.
Я понимаю, что я делаю неправильно, а именно, что он не знает, как агрегировать total_costи дата выставления счета, но я застрял на том, как сделать это с точки зрения SQL;книга использует функции агрегации искры и делает это:
selectExpr(
"CustomerId",
"(UnitPrice * Quantity) as total_cost",
"InvoiceDate")
.groupBy (col ("CustomerId"), window (col ("InvoiceDate"), "1 day")) .sum ("total_cost")
Но я пытаюсь понять, как я могу это сделать с помощью операторов SQL в качестве учебного упражнения.
Любая помощь в том, как сделать это с помощью запроса, приветствуется.
Я пытаюсь выяснить, как это сделать, когда я просто получаю общие итоги по каждому идентификатору клиента, а затем как получить полную функциональность изложения искры книги, где это общая сумма с разбивкой по часам по идентификатору клиента.
Спасибо
РЕДАКТИРОВАТЬ: Это источник данных;Я просто читаю все это в одном наборе данных
https://github.com/databricks/Spark-The-Definitive-Guide/tree/master/data/retail-data/by-day