#apache-spark
#apache-spark
Вопрос:
предположим, у меня есть 2 набора данных, как показано ниже
- книга
case class Book(book_name: String, cost: Int, writer_id:Int)
val bookDS = Seq(
Book("Scala", 400, 1),
Book("Spark", 500, 2),
Book("Kafka", 300, 3),
Book("Java", 350, 5)
).toDS()
bookDS.show()
- Писатель
case class Writer(writer_name: String, writer_id:Int)
val writerDS = Seq(
Writer("Martin",1),
Writer("Zaharia " 2),
Writer("Neha", 3),
Writer("James", 4)
).toDS()
writerDS.show()
Когда я внутренне присоединяюсь к нему, он возвращает два раза writer_id.
Как я могу получить writer_id только одного набора данных. Я не хочу писать sql, например, select a.something, b.something.
Комментарии:
1. Почему вы упомянули тег python? Это чистый код scala
Ответ №1:
writerDS.join(bookDS, Seq("writer_id")).show()
Вывод:
--------- ----------- --------- ----
|writer_id|writer_name|book_name|cost|
--------- ----------- --------- ----
| 1| Martin| Scala| 400|
| 2| Zaharia| Spark| 500|
| 3| Neha| Kafka| 300|
--------- ----------- --------- ----
Ответ №2:
Когда мы объединяем два набора данных, все столбцы из обоих наборов данных будут предварительно установлены в результирующем наборе данных, чтобы вы могли переименовать его, а затем удалить один из этих двух столбцов.
Dataset<Row> joinedDataset = bookDs
.withcolumnRenamed(writer_id,book_writer_id)
.join(writerDS,new Column(book_writer_id).equalTo(writer_id),"inner")
.drop(book_writer_id);
Не уверен, используете ли вы python или scala.
Это Java-код, пожалуйста, преобразуйте его соответствующим образом.