如何使用pyspark制作大小为n * k的空矩阵?
Posted
技术标签:
【中文标题】如何使用pyspark制作大小为n * k的空矩阵?【英文标题】:How to make null matrix of size n*k using pyspark? 【发布时间】:2019-10-09 13:30:25 【问题描述】:如果在 pyspark 中制作 n*n 矩阵以进行某些计算,我们有一个要求。使用 pyspark 可能我们尝试如下:
similarity_matrix = np.zeros(shape=(data1.count(),data1.count()))
similarity_matrix = spark.createDataFrame(similarity_matrix)
这里的数据是我们的 80K 长度的数据帧。有什么方法可以在 pyspark 中执行此操作,因为我们在执行此操作时遇到内存错误
【问题讨论】:
我相信您会发现 ML 库。一个我从pyspark.mllib.linalg import DenseMatrix
google ...DenseMatrix(2,2,range(4))
请发布错误信息。目前,您的方法行不通,因为您无法从这样的 numpy 数组创建数据框。这会导致以下错误:TypeError: Can not infer schema for type: <class 'numpy.ndarray'>
。也许你想看看this。
我看到以下错误:Exception: Traceback (most recent call last): File "/tmp/zeppelin_pyspark-4172965528199358051.py", line 326, in <module> exec(code) File "<stdin>", line 1, in <module> MemoryError
【参考方案1】:
size = 80000
schema = StructType([StructField(str(i), IntegerType(), True) for i in range(size)])
rdd = ss.range(size).rdd.map(lambda x: np.zeros(size))
df = ss.createDataFrame(rdd, schema)
或者在scala中
scala> val df = spark.range(80000).map(s=>new Array[Int](80000))
df: org.apache.spark.sql.Dataset[Array[Int]] = [value: array<int>]
scala> df.first.size
res35: Int = 80000
scala> df.count
res36: Long = 80000
【讨论】:
我猜 Pyspark 一个不起作用,因为它将是正确的数字数组以上是关于如何使用pyspark制作大小为n * k的空矩阵?的主要内容,如果未能解决你的问题,请参考以下文章