Самый простой способ сделать это как DataFrame
- сначала собрать два списка, а затем использовать UDF
- zip
два списка вместе. Что-то вроде:
import org.apache.spark.sql.functions.{collect_list, udf}
import sqlContext.implicits._
val zipper = udf[Seq[(String, Double)], Seq[String], Seq[Double]](_.zip(_))
val df = Seq(
("john", "tomato", 1.99),
("john", "carrot", 0.45),
("bill", "apple", 0.99),
("john", "banana", 1.29),
("bill", "taco", 2.59)
).toDF("name", "food", "price")
val df2 = df.groupBy("name").agg(
collect_list(col("food")) as "food",
collect_list(col("price")) as "price"
).withColumn("food", zipper(col("food"), col("price"))).drop("price")
df2.show(false)
# +----+---------------------------------------------+
# |name|food |
# +----+---------------------------------------------+
# |john|[[tomato,1.99], [carrot,0.45], [banana,1.29]]|
# |bill|[[apple,0.99], [taco,2.59]] |
# +----+---------------------------------------------+
Во-первых, попытайтесь использовать SQL Profiler для генерации .trc файла действия в базе данных для нормальной рабочей нагрузки за несколько часов. И затем используйте "Настраивающего Советника по вопросам Механизма базы данных" в меню SQL Server Management Studio Tools, чтобы видеть, предлагает ли оно какие-либо дополнительные индексы, сводные индексы или покрывающие индексы, которые могут быть выгодными.
Я никогда не использую подсказки запроса и главным образом работаю с многомиллионными базами данных строки. Они иногда могут влиять на производительность негативно.
Мой опыт состоит в том, что иногда Вы знаете больше о своем наборе данных затем, SQL Server делает. В этом случае необходимо использовать подсказки запроса. Другими словами: Вы помогаете оптимизатору решить.
Я однажды создаю datawarehouse, где SQL Server не использовал оптимальный индекс на сложном запросе. Путем предоставления индекса подсказывают в моем запросе, мне удалось заставить запрос пойти приблизительно в 100 раз быстрее.
Используйте их только после анализа плана запросов. Если Вы думаете, что Ваш запрос может работать быстрее при использовании другого индекса или при помощи их в другом порядке, дать серверу подсказку.
Индексная подсказка только сыграет роль, где Ваш запрос включает присоединяющиеся таблицы, и где столбцы, используемые для соединения с другой таблицей, соответствуют больше чем одному индексу. В этом случае механизм базы данных может принять решение использовать один индекс для создания соединения, и от расследования можно знать, что, если это использует другой индекс, запрос будет работать лучше. В этом случае Вы обеспечиваете индексную подсказку, говоря механизм базы данных, которые индексируют для использования.
Ключевой пункт, что я верю всем здесь, указывает, то, что с ОЧЕНЬ внимательным рассмотрением использование индексных подсказок может улучшить производительность Ваших запросов, ЕСЛИ И ТОЛЬКО ЕСЛИ, несколько индексов существуют, который мог использоваться для получения данных, И если SQL Server не использует корректный.
По моему опыту, я нашел, что не очень распространено должно Индексировать подсказки, я полагаю, что у меня, возможно, есть 2-3 запроса, которые используются сегодня, которые использовали их.... Надлежащее создание индекса и оптимизация базы данных должны получить Вас большая часть пути там к работающей базе данных.