Я всегда думал, что API набора данных / фрейма данных одинаковы ... и единственное отличие состоит в том, что API набора данных обеспечит вам безопасность времени компиляции. Правильно?
Итак .. У меня очень простой случай:
case class Player (playerID: String, birthYear: Int)
val playersDs: Dataset[Player] = session.read
.option("header", "true")
.option("delimiter", ",")
.option("inferSchema", "true")
.csv(PeopleCsv)
.as[Player]
// Let's try to find players born in 1999.
// This will work, you have compile time safety... but it will not use predicate pushdown!!!
playersDs.filter(_.birthYear == 1999).explain()
// This will work as expected and use predicate pushdown!!!
// But you can't have compile time safety with this :(
playersDs.filter('birthYear === 1999).explain()
Объяснение из первого примера покажет, что он НЕ выполняет предикатное нажатие (обратите внимание на пустые PressedFilters):
== Physical Plan ==
*(1) Filter <function1>.apply
+- *(1) FileScan csv [...] Batched: false, Format: CSV, Location: InMemoryFileIndex[file:People.csv], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<playerID:string,birthYear:int,birthMonth:int,birthDay:int,birthCountry:string,birthState:s...
В то время как второй пример будет делать это правильно (обратите внимание на PressedFilters):
== Physical Plan ==
*(1) Project [.....]
+- *(1) Filter (isnotnull(birthYear#11) && (birthYear#11 = 1999))
+- *(1) FileScan csv [...] Batched: false, Format: CSV, Location: InMemoryFileIndex[file:People.csv], PartitionFilters: [], PushedFilters: [IsNotNull(birthYear), EqualTo(birthYear,1999)], ReadSchema: struct<playerID:string,birthYear:int,birthMonth:int,birthDay:int,birthCountry:string,birthState:s...
Итак, вопрос в том ... как я могу использовать DS Api и обеспечить безопасность времени компиляции ... и предикатное нажатие, работающее так, как ожидалось ????
Возможно ли это? Если нет .. значит ли это, что DS api обеспечивает безопасность времени компиляции ... но за счет производительности! ??? (DF будет намного быстрее в этом случае .. особенно при обработке больших файлов паркета)