Apache spark 如何使用加入spark dataframe api实现服务器端过滤

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"

这是我的spark应用程序的一部分。第一部分是我在过去1小时内获取所有文章的部分,代码的第二部分获取所有这些文章的注释。第三部分是对文章的评论。 问题是articles.maplambda x:x.id,x.id.joinaxes部分太慢,大约需要1分钟。我想把这提高到10秒甚至更少,但不知道怎么做?谢谢你的回复

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