Как получить ключ отдельного массива данных в соединениях spark

#apache-spark

#apache-spark

Вопрос:

предположим, у меня есть 2 набора данных, как показано ниже

  1. книга
     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()
  
  1. Писатель
     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-код, пожалуйста, преобразуйте его соответствующим образом.