У меня есть фрейм данных, к которому я применяю фильтр, а затем серию преобразований.В конце я выбираю несколько столбцов.
// Filters the event related to a user_principal.
var filteredCount = events.filter("Properties.EventTypeName == 'user_principal_created' or Properties.EventTypeName == 'user_principal_updated'");
// Selects the columns based on the event type.
.withColumn("Username", when(col("Properties.EventTypeName") === lit("user_principal_created"), col("Body.Username"))
.otherwise(col("Body.NewValue.Username")))
.withColumn("FirstName", when(col("Properties.EventTypeName") === lit("user_principal_created"), col("Body.FirstName"))
.otherwise(col("Body.NewValue.FirstName")))
.withColumn("LastName", when(col("Properties.EventTypeName") === lit("user_principal_created"), col("Body.LastName"))
.otherwise(col("Body.NewValue.LastName")))
.withColumn("PrincipalId", when(col("Properties.EventTypeName") === lit("user_principal_created"), col("Body.PrincipalId"))
.otherwise(col("Body.NewValue.PrincipalId")))
.withColumn("TenantId", when(col("Properties.EventTypeName") === lit("user_principal_created"), col("Body.TenantId"))
.otherwise(col("Body.NewValue.TenantId")))
.withColumnRenamed("Timestamp", "LastChangeTimestamp")
// Create the custom primary key.
.withColumn("PrincipalUserId", substring(concat(col("TenantId"), lit("-"), col("PrincipalId")), 0, 128))
// Select the rows.
.select("PrincipalUserId", "TenantId", "PrincipalId", "FirstName", "LastName", "Username", "LastChangeTimestamp")
Работает, только если в events
есть строки, которые соответствуют фильтру.Если ни одна строка не соответствует фильтру, я получаю следующее исключение:
org.apache.spark.sql.AnalysisException: Нет такого поля структуры Имя пользователя в ...
Вопрос
Что я могу сделать, чтобы справиться с таким сценарием и предотвратить сбой withColumn
?
Обновление
Вот логический план, когда он работает:
== Анализируемый логический план == Тело: структура, CitationNumber: строка, Цвет: строка, CommitReference: строка, ContactAddress: структура, ControlId: строка,Данные: строка зависимости: массив>, Описание: строка, DeviceId: строка, ошибка: BIGINT, ErrorDetails: строка, освобождение: структура, ExternalId: строка, FeatureId: строка Особенности: массив, FirstName: строка, GroupPrincipals: массив, GroupType: bigint, Id: bigint, IsAuthorized: логическое значение, IsDedicatedStorage: логическое значение, IsEnabled: логическое значение, IsInitialCreation: логическое значение, ... еще 33 поля>, Id: строка, свойства: struct, Метка времени: строка Отношение [Тело # 248, Id #249, свойства № 250, отметка времени № 251] json
И когда выдается исключение:
== Анализируемый логический план == Тело: структура, Id: bigint, IsAuthorized: логическое значение, Широта: двойное, Долгота: двойное, Имя: строка,NewValue: структура, OldValue: структура, Порядковый: BIGINT, ParentZoneId: строка, PrincipalId: BIGINT, PrincipalName: строка, Требования: массив, FeatureId: строка, RequirementId: строка, ServiceId: строка >>, FeatureId: строка, RequirementId: строка,ServiceId: строка >>, RestrictedZoneId: bigint, StreetName: строка, TenantId: строка, метка времени: строка, ... еще 2 поля>, Id: строка, свойства: структура, метка времени: строка Соотношение [Body # 44, Id # 45, Свойства # 46, метка времени # 47] json