Como forçar o Spark a avaliar as operações do DataFrame em linha
De acordo comDocumentos do Spark RDD:
Todas as transformações no Spark são preguiçosas, pois não computam seus resultados imediatamente ... Esse design permite que o Spark seja executado com mais eficiência.
Há momentos em que preciso fazer certas operações nos meus quadros de dadosnaquele momento e agora. Mas porque as operações de dataframe são "preguiçosamente avaliado"(conforme acima), quando escrevo essas operações no código, há muito pouca garantia de que o Spark irána realidade execute essas operações alinhadas com o restante do código. Por exemplo:
val someDataFrame : DataFrame = getSomehow()
val someOtherDataFrame : DataFrame = getSomehowAlso()
// Do some stuff with 'someDataFrame' and 'someOtherDataFrame'
// Now we need to do a union RIGHT HERE AND NOW, because
// the next few lines of code require the union to have
// already taken place!
val unionDataFrame : DataFrame = someDataFrame.unionAll(someOtherDataFrame)
// Now do some stuff with 'unionDataFrame'...
Portanto, minha solução alternativa para isso (até agora) foi executar.show()
ou.count()
imediatamente após minha operação de dataframe sensível ao tempo, da seguinte maneira:
val someDataFrame : DataFrame = getSomehow()
val someOtherDataFrame : DataFrame = getSomehowAlso()
// Do some stuff with 'someDataFrame' and 'someOtherDataFrame'
val unionDataFrame : DataFrame = someDataFrame.unionAll(someOtherDataFrame)
unionDataFrame.count() // Forces the union to execute/compute
// Now do some stuff with 'unionDataFrame'...
...qualforças Spark para executar o dataframe op logo em seguida, inline.
Isso parece terrivelmente hacky / kludgy para mim. Então eu pergunto:existe uma maneira mais geralmente aceita e / ou eficiente deforça as operações de dataframe acontecem sob demanda (e não são avaliadas preguiçosamente)?