PySpark - 从 Numpy 矩阵创建 DataFrame

Posted

技术标签:

【中文标题】PySpark - 从 Numpy 矩阵创建 DataFrame【英文标题】:PySpark - Create DataFrame from Numpy Matrix 【发布时间】:2018-01-11 12:03:12 【问题描述】:

我有一个 numpy 矩阵:

arr = np.array([[2,3], [2,8], [2,3],[4,5]])

我需要从arr 创建一个 PySpark 数据框。我无法手动输入值,因为arr 的长度/值将动态变化,因此我需要将arr 转换为数据框。

我尝试了以下代码没有成功。

df= sqlContext.createDataFrame(arr,["A", "B"])

但是,我收到以下错误。

TypeError: Can not infer schema for type: <type 'numpy.ndarray'>

【问题讨论】:

【参考方案1】:
import numpy as np

#sample data
arr = np.array([[2,3], [2,8], [2,3],[4,5]])

rdd1 = sc.parallelize(arr)
rdd2 = rdd1.map(lambda x: [int(i) for i in x])
df = rdd2.toDF(["A", "B"])
df.show()

输出是:

+---+---+
|  A|  B|
+---+---+
|  2|  3|
|  2|  8|
|  2|  3|
|  4|  5|
+---+---+

【讨论】:

【参考方案2】:

无需使用 RDD API。简单地说:

mat = np.random.random((10,3))
cols = ["ColA","ColB","ColC"]
df = spark.createDataFrame(mat.tolist(), cols)
df.show()

【讨论】:

【参考方案3】:
import numpy as np
from pyspark.ml.linalg import Vectors
arr = np.array([[2,3], [2,8], [2,3],[4,5]])
df = np.concatenate(arr).reshape(1000,-1)
dff = map(lambda x: (int(x[0]), Vectors.dense(x[1:])), df)
mydf = spark.createDataFrame(dff,schema=["label", "features"])
mydf.show(5)

【讨论】:

我在第 4 行收到 ValueError: cannot reshape array of size 8 into shape (1000,newaxis)

以上是关于PySpark - 从 Numpy 矩阵创建 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Pyspark 的 SVM 拟合两个 numpy 矩阵?

PySpark 可以使用 numpy 数组吗?

pyspark:将稀疏局部矩阵转换为 RDD

如何使用 numpy 从一维数组创建对角矩阵?

从 numpy 数组创建稀疏矩阵

删除在 pyspark 中使用 numpy.savetxt 创建的 csv 文件