#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")))