Поскольку у вас есть то, что выглядит как столбец первичного ключа, просто вставьте временную метку со столбцом id в собственный фрейм данных, чтобы позже присоединиться к нему позже.
val tsDF = dataDF.select("TEST_PK", "h_timestamp")
Затем удалите столбец из dataDF
, выполните свою операцию и снова присоедините h_timestamp обратно на новый фрейм данных.
val finalDF = postopDF.join(tsDF, "TEST_PK")
Обновление
Пример кода полезен, вам следуетвозможность по существу разбить вашу строку и перестроить новую строку с желаемыми значениями примерно так:
dataDF.map(row => {
val rowWithoutTimestamp = Row(
row.getAs[Long]("TEST_PK"),
row.getAs[String]("COL_1"),
row.getAs[Long]("COL_2"),
row.getAs[Double]("COL_3")
)
val timestamp = row.getAs[Long]("h_timestamp")
val result = operation(rowWithoutTimestamp, timestamp)
Row(result, timestamp)
})
Конечно, я не уверен, что возвращает ваш operation()
, поэтому это может быть необходиморазобрать result
на отдельные значения и составить новую строку с этими значениями и отметкой времени.
Обновление 2
Хорошо, вот более общий метод.Он упаковывает «все столбцы, кроме» h_timestamp
в структуру, и отображает кортеж (struct, ts)
.Во всяком случае, на самом деле более элегантно, чем предыдущее решение.
val cols = df.drop("h_timestamp").columns.toSeq
dataDF
.select(struct(cols.map(c => col(c)):_*).as("row_no_ts"), $"h_timestamp")
.map(row => {
val rowWithoutTimestamp = row.getAs[Row]("row_no_ts")
val timestamp = row.getAs[Long]("h_timestamp")
operation(rowWithoutTimestamp, timestamp)
})
Я не уверен, что вы отображаете только вывод operation()
или некоторую комбинацию с меткой времени снова, но оба доступны для изменения вудовлетворить ваши потребности.