У меня есть массив [DataFrame], и я хочу проверить для каждой строки каждого фрейма данных, если есть какое-либо изменение значений по столбцу. Скажем, у меня есть первый ряд из трех кадров данных, например:Как объединить (объединить) информацию по массиву [DataFrame]
(0,1.0,0.4,0.1)
(0,3.0,0.2,0.1)
(0,5.0,0.4,0.1)
Первая колонка это идентификатор, и мой идеальный выход для этого ID будет:
(0, 1, 1, 0)
что означает, что второй и третий столбцы изменились, а третий - нет. я придаю здесь немногих данных для репликации моих настроек
val rdd = sc.parallelize(Array((0,1.0,0.4,0.1),
(1,0.9,0.3,0.3),
(2,0.2,0.9,0.2),
(3,0.9,0.2,0.2),
(4,0.3,0.5,0.5)))
val rdd2 = sc.parallelize(Array((0,3.0,0.2,0.1),
(1,0.9,0.3,0.3),
(2,0.2,0.5,0.2),
(3,0.8,0.1,0.1),
(4,0.3,0.5,0.5)))
val rdd3 = sc.parallelize(Array((0,5.0,0.4,0.1),
(1,0.5,0.3,0.3),
(2,0.3,0.3,0.5),
(3,0.3,0.3,0.1),
(4,0.3,0.5,0.5)))
val df = rdd.toDF("id", "prop1", "prop2", "prop3")
val df2 = rdd2.toDF("id", "prop1", "prop2", "prop3")
val df3 = rdd3.toDF("id", "prop1", "prop2", "prop3")
val result:Array[DataFrame] = new Array[DataFrame](3)
result.update(0, df)
result.update(1,df2)
result.update(2,df3)
Как можно сопоставить по массиву и получить свой выход?
Я выбрал этот ответ, так как он играет лучше с моими фактическими данными, но я не знаю, является ли один ответ более эффективным, чем другой, что лучше подходит для хорошего ответа. – user299791
Вы всегда можете обогнать и ждать, пока не будете измерять производительность. Вообще говоря, оба требуют большого сетевого трафика. Лично я, вероятно, переписал бы ответ, предоставленный @marios, с использованием операторов SQL, не отбрасывая на RDD. – zero323