Если я правильно понимаю, вы пытаетесь создать DataFrame
для уникального значения в столбце 'fileName'.
Вы не можете spilt
a DataFrame
, поэтому вам придется применять преобразование к исходному DataFrame для каждого дочернего DataFrame, который вы хотите создать.
Если вы знаете, что есть только два значения, затем
df1 = dfInfo.filter(col("filename") === "file:/home/serasa.intranet/c81484a/teste/file01" // or endsWith "1"
df1 = dfInfo.filter(col("filename") === "file:/home/serasa.intranet/c81484a/teste/file01" // or endsWith "2"
А если неизвестно, то вы можете написать обобщенную функцию c, как показано ниже:
//returns Array of [column value as String and DataFrame]
def generateFrames(df: DataFrame, by: Column): Array[(String, DataFrame)] = {
val distinctRecords = df.select(by).distinct().cache()
if (distinctRecords.filter(by.isNull).count() == 0)
distinctRecords.collect().map(r => (r.get(0).toString, df.filter(by === r.get(0))))
else
//If column contains any null value.
distinctRecords.filter(by.isNotNull).collect().map(r => (r.get(0).toString, df.filter(by === r.get(0)))) :+ ("Null", df.filter(by.isNull))
}
, поэтому в вашем примере это будет:
generateFrames(dfInfo, col("filename")).foreach(v => {
println(s"Invoking show on DF: ${v._1}")
v._2.show()
}
)
Примечание : Если вы собираетесь вызывать действие для каждой отдельной линии DataFrame
отдельно, я бы посоветовал вам сначала кэшировать ее.