Я думаю, вам нужно сделать это по-другому.Я буду предполагать, что FlightData является классом с вышеуказанной схемой.Итак, решение использует карту и уменьшите, как показано ниже:
val totalSum = dataDS.map(_.count).reduce(_+_) //this line replace the above error as col("count") can't be selected.
Обновлено : проблема вывода не связана с набором данных. На самом деле, когда вы используете select, вы будете работать надDataframe (то же самое, если вы присоединяетесь), который не является статически типизированной схемой, и вы потеряете функцию класса вашего делаНапример, тип выбора будет Dataframe, а не Dataset, поэтому вы не сможете вывести тип.
val x: DataFrame = dataDS.select('count)
val x: Dataset[Int] = dataDS.map(_.count)
Кроме того, из этого Ответ Чтобы получить TypedColumn
из столбца вы просто используете myCol.as[T]
.
Я сделал простой пример для воспроизведения кода и данных.
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SparkSession}
object EntryMainPoint extends App {
//val warehouseLocation = "file:${system:user.dir}/spark-warehouse"
val spark = SparkSession
.builder()
.master("local[*]")
.appName("SparkSessionZipsExample")
//.config("spark.sql.warehouse.dir", warehouseLocation)
.getOrCreate()
val someData = Seq(
Row("United States", "Romania", 15),
Row("United States", "Croatia", 1),
Row("United States", "Ireland", 344),
Row("Egypt", "United States", 15)
)
val flightDataSchema = List(
StructField("DEST_COUNTRY_NAME", StringType, true),
StructField("ORIGIN_COUNTRY_NAME", StringType, true),
StructField("count", IntegerType, true)
)
case class FlightData(DEST_COUNTRY_NAME: String, ORIGIN_COUNTRY_NAME: String, count: Int)
import spark.implicits._
val dataDS = spark.createDataFrame(
spark.sparkContext.parallelize(someData),
StructType(flightDataSchema)
).as[FlightData]
val totalSum = dataDS.map(_.count).reduce(_+_) //this line replace the above error as col("count") can't be selected.
println("totalSum = " + totalSum)
dataDS.printSchema()
dataDS.show()
}
Вывод ниже
totalSum = 375
root
|-- DEST_COUNTRY_NAME: string (nullable = true)
|-- ORIGIN_COUNTRY_NAME: string (nullable = true)
|-- count: integer (nullable = true)
+-----------------+-------------------+-----+
|DEST_COUNTRY_NAME|ORIGIN_COUNTRY_NAME|count|
+-----------------+-------------------+-----+
| United States| Romania| 15|
| United States| Croatia| 1|
| United States| Ireland| 344|
| Egypt| United States| 15|
+-----------------+-------------------+-----+
Примечание:Вы можете сделать выборку из набора данных, используя приведенный ниже способ
val countColumn = dataDS.select('count) //or map(_.count)
. Вы также можете посмотреть этот lowerByKey в наборе данных Spark