这是在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 更新/删除配置单元表数据吗?

这是在 Vue 中下载文件的正确方法吗?

这是在 laravel 中添加工具提示的正确方法吗?

这是在 JavaScript 中形成闭包的正确方法吗? [关闭]

这是在 React 中更改对象状态变量的最安全、最正确的方法吗?

这是在Java中将字符转换为字符串的正确方法吗? [复制]