我使用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。
提前致谢
答案 0 :(得分:0)
我认为第一步是不必要的。你可以这样做:
openssl
我希望这会有所帮助。