SparkSQL: Внутреннее соединение возвращает перекрестное соединение - PullRequest
0 голосов
/ 14 октября 2018

ВСЕГО РЕДАКТИРОВАННО

Итак, я хочу выполнить внутреннее объединение двух наборов данных.Первый (metlistafter):

+------------------------------------+-------------+---------+
|                        experimentid|  description|intensity|
+------------------------------------+-------------+---------+
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  77.4946|
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  14.6063|
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|   30.593|
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  76.2769|
+------------------------------------+-------------+---------+

, а второй (metlistbeforetemp):

+------------------------------------+-------------+---------+
|                        experimentid|  description|intensity|
+------------------------------------+-------------+---------+
|231d4040-d486-4e8b-937a-aebe645ef8ae|1_3-butadiene|  124.379|
|231d4040-d486-4e8b-937a-aebe645ef8ae|1_3-butadiene|  175.656|
|231d4040-d486-4e8b-937a-aebe645ef8ae|1_3-butadiene|  184.736|
|231d4040-d486-4e8b-937a-aebe645ef8ae|1_3-butadiene|  58.0333|
|231d4040-d486-4e8b-937a-aebe645ef8ae|1_3-butadiene|  205.899|
+------------------------------------+-------------+---------+

что мне нужно (всего 4 строки):

+------------------------------------+-------------+---------+-------------+---------+
|                        experimentid|  description|intensity|  description|intensity|
+------------------------------------+-------------+---------+-------------+---------+
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  77.4946|1_3-butadiene|  124.379|
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  14.6063|1_3-butadiene|  175.656|
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|   30.593|1_3-butadiene|  184.736|
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  76.2769|1_3-butadiene|  58.0333|
+------------------------------------+-------------+---------+-------------+---------+

Но я получаю перекрестный результат!(всего 4x5 = 20 строк):

+------------------------------------+-------------+---------+------------------------------------+-------------+---------+
|                        experimentid|  description|intensity|                        experimentid|  description|intensity|
+------------------------------------+-------------+---------+------------------------------------+-------------+---------+
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  77.4946|231d4040-d486-4e8b-937a-aebe645ef8ae|1_3-butadiene|  124.379|
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  77.4946|231d4040-d486-4e8b-937a-aebe645ef8ae|1_3-butadiene|  175.656|
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  77.4946|231d4040-d486-4e8b-937a-aebe645ef8ae|1_3-butadiene|  184.736|
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  77.4946|231d4040-d486-4e8b-937a-aebe645ef8ae|1_3-butadiene|  58.0333|
|231d4040-d486-4e8b-937a-aebe645ef8ae|Palmitic acid|  77.4946|231d4040-d486-4e8b-937a-aebe645ef8ae|1_3-butadiene|  205.899|
...(more rows)

Мой полный код такой:

Dataset<Row> metlistafter = sp.emptyDataFrame();            
        Dataset<Row> metlistinitial = sp.read().format("org.apache.spark.sql.cassandra")
            .options(new HashMap<String, String>() {
                {
                    put("keyspace", "mdb");
                    put("table", "experiment");
                }
            })
            .load().select(col("experimentid"), col("description"), col("intensity")).filter(col("experimentid").isin(experimentlist.toArray())).filter(col("description").isin(metabolitelist.toArray()));

        for(int iexp=0;iexp<experimentlist.size();iexp++){
            for(int imet=0;imet<metabolitelist.size();imet++){
                Dataset<Row> metlistbeforetemp = metlistinitial.select(col("experimentid").alias("experimentid"), col("description").alias("description"),col("intensity").alias("intensity")).filter(col("experimentid").isin(experimentlist.get(iexp))).filter(col("description").isin(metabolitelist.get(imet)));
                if(imet==0){
                    metlistafter = metlistbeforetemp.select(col("experimentid"), col("description"),col("intensity"));
                }else{
                    metlistafter=metlistafter.join(metlistbeforetemp,metlistafter.col("experimentid").equalTo(metlistbeforetemp.col("experimentid")),"inner");//.where(metlistafter.col("experimentid").equalTo(metlistbeforetemp.col("experimentid")));
                    System.out.println("result "+metlistafter.count());metlistafter.show();
                }
            }
        }

Итак, в основном я хочу непрерывно добавлять столбцы из набора данных metlistbeforetemp вmetlistafter набор данных!То есть, если metlistbeforetemp.count () равен 25 с 3 столбцами, а metlistafter.count () - 22 с 3 столбцами, то я хочу объединить эти два и назначить результат metlistafter.Так что я бы имел metlistafter.count () = 22 с 5 столбцами!Извините за мою двусмысленность.Я действительно пытаюсь объяснить это как можно лучше!

...