这是在pyspark上做乘法的正确方法吗?
Posted
技术标签:
【中文标题】这是在pyspark上做乘法的正确方法吗?【英文标题】:is this the right way to do multiplication on pyspark? 【发布时间】:2018-03-02 23:48:45 【问题描述】:pyspark 新手。这是我的代码:
def sparkApp():
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.sql.catalogImplementation", "hive") \
.config("spark.executor.memory", "4g") \
.config("spark.driver.memory", "16g") \
.config("spark.executor.instances", "5") \
.config("spark.executor.cores", "5") \
.getOrCreate()
return spark
def my_f(x, w):
return np.array(x).dot(w).sum()
w = [1,2]
x = sparkApp().("select x1, x2 from my_table")
x.rdd.map(lambda row: my_f(row, w)
我的问题是: 1. 我知道这会并行化 x 的读取,但它会并行化 x 和 w 的乘法吗?如果是这样,它会返回与输入相同索引中的值吗?如果没有,我该如何并行运行它? 2.我是广播w还是作为参数传递?
谢谢
【问题讨论】:
您是否测试过代码是否有效? 【参考方案1】:您的方法实际上并没有给出点积。相反,您的答案只是返回 (x1+x2)*w。它确实使用了并行性,但效率并不高。
如果你想手动计算点积,你可以创建一个包含 x 和 w 元素的 RDD 对。像 [(x1, w1), (x2, w2)] 之类的东西,然后并行化为对 RDD 中的每个元素计算乘积的过程,然后将结果相加。
最后一个选项是使用模块pyspark.ml.linalg 中的点函数。如果你的向量是从 spark dataframe/rdd/dataset 访问的,它应该使用 spark 提供的并行性。
【讨论】:
以上是关于这是在pyspark上做乘法的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章
PySpark 无法通过 sparkContext/hiveContext 读取 Hive ORC 事务表?我们可以使用 Pyspark 更新/删除配置单元表数据吗?
这是在 JavaScript 中形成闭包的正确方法吗? [关闭]