Более быстрый способ получить значение одной ячейки из кадра данных (используя только преобразование)

#scala #apache-spark #apache-spark-sql #azure-databricks

Вопрос:

У меня есть следующий код, в котором я хочу получить кадр данных dfDateFiltered из dfBackendInfo, содержащий все строки с временем создания строки, превышающим отметку времени «Последнее время создания».

 val latestRowCreationTime = dfVersion.agg(max("BackendRowCreationTime")).first.getTimestamp(0)
val dfDateFiltered = dfBackendInfo.filter($"RowCreationTime" > latestRowCreationTime)
 

Проблема, которую я вижу, заключается в том, что первая строка добавляет задание в кластер Databricks, что делает его более медленным.
Есть ли в любом случае, если бы я мог использовать лучший способ фильтрации (например, просто используя преобразование вместо действия)?

Ниже приведены схемы 2 кадров данных:

 case class Version(BuildVersion:String,
                   MainVersion:String,
                   Hotfix:String,
                   BackendRowCreationTime:Timestamp)
                   
case class BackendInfo(SerialNumber:Integer,
                       NumberOfClients:Long,
                       BuildVersion:String,
                       MainVersion:String,
                       Hotfix:String,
                       RowCreationTime:Timestamp)
 

Комментарии:

1. Можете ли вы добавить схему двух фреймов данных?

2. Пожалуйста, ознакомьтесь с приведенным выше отредактированным вопросом.

3. Возможно, если вы сможете объединить два набора данных с помощью одного из полей, вы могли бы включить фильтр в качестве второго условия объединения, чтобы выполнить фильтр за одно действие. Если вам нужно запросить первый набор данных для извлечения значения, вам понадобятся два действия, если вы хотите работать с двумя наборами данных в одном действии, вы должны присоединиться к двум DSS.

4. Спасибо за предложение. Я опубликовал ниже рабочее решение.

Ответ №1:

Приведенный ниже код работал:

 val dfLatestRowCreationTime1 = dfVersion.agg(max($"BackendRowCreationTime").as("BackendRowCreationTime")).limit(1)
val latestRowCreationTime = dfLatestRowCreationTime1.withColumn("BackendRowCreationTime", when($"BackendRowCreationTime".isNull, DefaultTime))
val dfDateFiltered = dfBackendInfo.join(latestRowCreationTime, dfBackendInfo.col("RowCreationTime").gt(latestRowCreationTime.col("BackendRowCreationTime")))