SparkSQL加入父/子数据集

时间:2017-10-12 17:42:59

标签: apache-spark cassandra apache-spark-sql spark-cassandra-connector

我使用SparkSQL 2.2.0从Cassandra加载数据并将其索引到Elasticsearch。我的数据包括客户(第一个表mvn clean package)和订单(第二个表people) 表格订单有一列orders,指向相应的客户 我的需求是查询(以及稍后在Elasticsearch中索引)person_id表和people,这样我就可以为每个客户提供她购买的订单数量。
我想到的最简单的方法是将两个表读入orders s并在org.apache.spark.sql.Dataset<Row>列上进行加入。然后我person_id
这给了我一个包含两列的数据集:groupBy(person_id)person_id,我不得不与count表联系回来,这样我就可以计算其他人的数据了。

people

Dataset<Row> peopleWithOrders = people.join(orders, people.col("id").equalTo(orders.col("person_id")), "left_outer"); Dataset<Row> peopleOrdersCounts = peopleWithOrders.groupBy("id").count().withColumnRenamed("id", "personId"); Dataset<Row> peopleWithOrderCounts = people.join(personsOrdersCounts, people.col("id").equalTo(peopleOrdersCounts.col("personId")), "left_outer") .withColumnRenamed("count", "nbrOfOrders") .select("id", "name", "birthDate", "nbrOfOrders"); 表有1_000_000行,people表有2_500_000。每个客户有2或3个订单 我使用的是MAC Book pro,配备2.2 GHz Intel Core i7处理器和16 GB 1600 MHz DDR3内存。所有Cassandra,Spark 2.2主人和(单人)工人都在同一台机器上 这3个连接需要15到20秒 我的问题是:是否有一些提升业绩的空间。 窗口聚合函数有好处,因为我在日志中看到了ShuffleMapTask。

提前致谢

1 个答案:

答案 0 :(得分:0)

我认为第一步是不必要的。你可以这样做:

openssl

我希望这会有所帮助。