Я пишу тесты для функции, которая принимает DataFrame actualDF
и в какой-то момент запускает actualDF.select("message.data.*", "message.headers.timestamp")
, и у меня есть данные, которые будут выбраны message.data.*
как DataFrame с именем testDF
.Поэтому мне нужно сделать новый actualDF
, который возвращает данные testDF
, а также фальшивую временную метку, когда выполняется приведенный выше оператор выбора.
Это данные внутри testDF
root
|-- ACCEPTED_DATE: string (nullable = true)
|-- BRAND_ID: string (nullable = true)
|-- ...etc...
И вот что мне нужно, чтобы подделка actualDF
выглядела так:
root
|-- message: struct (nullable = true)
| |-- data: struct (nullable = true)
| | |-- ACCEPTED_DATE: string (nullable = true)
| | |-- BRAND_ID: string (nullable = true)
| | |-- ...etc...
| |-- headers: struct (nullable = true)
| | |-- timestamp: string (nullable = true)
У меня естьпопытался сделать несколько вещей, чтобы достичь этого, но я не думаю, что приблизился к правильному пониманию, самое близкое, что я получил, было:
val empty = spark.emptyDataFrame
val actualDF = empty.withColumn( "data", struct( testDF.columns.map(s => testDF.col(s)): _* ) ).withColumn("headers.timestamp", lit(1))
, который я надеялся прикрепить testDF
к пустому DataFrame, но это не сработало, и я полагаю, что в любом случае это было бы плохим решением.