Apache spark 如何使用加入spark dataframe api实现服务器端过滤
这是我的spark应用程序的一部分。第一部分是我在过去1小时内获取所有文章的部分,代码的第二部分获取所有这些文章的注释。第三部分是对文章的评论。 问题是articles.maplambda x:x.id,x.id.joinaxes部分太慢,大约需要1分钟。我想把这提高到10秒甚至更少,但不知道怎么做?谢谢你的回复Apache spark 如何使用加入spark dataframe api实现服务器端过滤,apache-spark,cassandra,datastax,datastax-enterprise,Apache Spark,Cassandra,Datastax,Datastax Enterprise,这是我的spark应用程序的一部分。第一部分是我在过去1小时内获取所有文章的部分,代码的第二部分获取所有这些文章的注释。第三部分是对文章的评论。 问题是articles.maplambda x:x.id,x.id.joinaxes部分太慢,大约需要1分钟。我想把这提高到10秒甚至更少,但不知道怎么做?谢谢你的回复 articles = sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="articles"
articles = sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="articles", keyspace=source).load() \
.map(lambda x:x).filter(lambda x:x.created_at!=None).filter(lambda x:x.created_at>=datetime.now()-timedelta(hours=1) and x.created_at<=datetime.now()-timedelta(hours=0)).cache()
axes = sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="axes", keyspace=source).load().map(lambda x:(x.article,x))
speed_rdd = articles.map(lambda x:(x.id,x.id)).join(axes)
我在这里尝试了这个方法,它应该替代我代码的最后一部分,这也是我想要的解决方案,但它似乎无法正常工作:
in_expr = col("article").isin(article_ids.collect())
axes = sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="axes", keyspace=source).load().where(in_expr)
我总是收到以下错误消息:
in_expr = col("article").isin(article_ids.collect())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Column' object is not callable
感谢您的帮助。如果您想获得合理的性能,请不要将数据转换为RDD。它不仅使谓词下推之类的优化变得不可能,而且还引入了将数据从JVM移动到Python的巨大开销
相反,您应该以类似以下方式使用SQL表达式/DataFrame API:
从pyspark.sql.functions导入col、expr、当前_时间戳
range_expr=colcreated_at.between
当前时间戳-每隔1小时,
当前时间戳
articles=sqlContext.read.formatorg.apache.spark.sql.cassandra
.选项…加载
.wherecolcreated_at.isNotNull这不是必需的
.whererange_expr
还可以像以前一样使用标准Python实用程序来构造谓词表达式:
导入日期时间
range_expr=colcreated_at.between
datetime.datetime.now-datetime.timedeltahours=1,
datetime.datetime.now
后续连接也应在不将数据移出数据帧的情况下执行:
axes=sqlContext.read.formatorg.apache.spark.sql.cassandra
.选项。。。
负载
articles.joinaxes[id]
如果您想获得合理的性能,请不要将数据转换为RDD。它不仅使谓词下推之类的优化变得不可能,而且还引入了将数据从JVM移动到Python的巨大开销
相反,您应该以类似以下方式使用SQL表达式/DataFrame API:
从pyspark.sql.functions导入col、expr、当前_时间戳
range_expr=colcreated_at.between
当前时间戳-每隔1小时,
当前时间戳
articles=sqlContext.read.formatorg.apache.spark.sql.cassandra
.选项…加载
.wherecolcreated_at.isNotNull这不是必需的
.whererange_expr
还可以像以前一样使用标准Python实用程序来构造谓词表达式:
导入日期时间
range_expr=colcreated_at.between
datetime.datetime.now-datetime.timedeltahours=1,
datetime.datetime.now
后续连接也应在不将数据移出数据帧的情况下执行:
axes=sqlContext.read.formatorg.apache.spark.sql.cassandra
.选项。。。
负载
articles.joinaxes[id]
火花卡桑德拉连接器会自动检测到1个谓词下推,只要可以使用过滤主键或辅助索引在卡桑德拉中进行过滤: 2要获得更高效的联接,可以调用方法repartitionByCassandraReplica。不幸的是,此方法可能不适用于PySpark,仅适用于Scala/JavaAPI。请在此处阅读文档:
3另一个提示是尝试调试并理解连接器是如何创建Spark分区的。文档中提到了一些示例和注意事项:1谓词下推由Spark Cassandra连接器自动检测,只要可以在Cassandra中使用主键进行过滤或使用辅助索引进行过滤: 2要获得更高效的联接,可以调用方法repartitionByCassandraReplica。不幸的是,此方法可能不适用于PySpark,仅适用于Scala/JavaAPI。请在此处阅读文档:
3另一个提示是尝试调试并理解连接器是如何创建Spark分区的。文档中提到了一些示例和注意事项:1.5b中引入了isin,我很确定您想要的是将这篇文章展平\u id.collect。我试图展平它,但它并没有真正提高速度。加载时,sqlContext.read.format部分的默认分区号为255,我想将其缩小,因为该部分根据分区从cassandra读取的速度较慢,但不知道如何读取。有什么想法吗?Thanksa isin已经在1.5b中引入,我很确定您想要的是首先将这篇文章展平。\u ids.collect。我试图展平它,但它并没有真正提高速度。加载时,sqlContext.read.format部分的默认分区号为255,我想将其缩小,因为该部分根据分区从cassandra读取的速度较慢,但不知道如何读取。有什么想法吗?谢谢
in_expr = col("article").isin(article_ids.collect())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Column' object is not callable