如何将numpy数组元素转换为引发RDD列值

时间:2018-06-11 19:01:16

标签: python numpy apache-spark

我正准备使用spark数据帧(不是pandas)的内置CSV打印工具。我已经建立了一个IndexedRowMatrix。因此,其中有稀疏的数组列。通过x.vector.toArray()映射调用(下面)执行到密集数组的转换。我似乎无法弄清楚,如何将密集的numpy数组元素放入Spark DataFrame的各个列中。 (我不会引入大熊猫。)如何将这个RDD放入7列数据帧,包括一个字符串列和六个整数列?到目前为止我的代码:

X = CoordinateMatrix(sc.parallelize(entries)) 
Xirm = X.toIndexedRowMatrix()
colnames = "username," + ','.join(str(cell) for cell in itemids.keys())  # Make CSV header line
# Might need this for speed: Arrow:  https://bryancutler.github.io/createDataFrame/  See above conf=...
XX = Xirm.rows.map(lambda x: (lu[x.index], x.vector.toArray())) # ?
print(XX.take(2))
df = XX.toDF() #TypeError: Can not infer schema for type: <class 'numpy.ndarray'>
#df.write.csv(header=colnames, path=out_filename)

以下是看(2)数据示例:

[('kygiacomo', array([ 0.,  1.,  0.,  0.,  0.,  0.])), ('namohysip', array([ 1.,  0.,  0.,  0.,  0.,  0.]))]

看问题是RDD元组有2列,但我在DataFrame中需要7列。列数是动态确定的,我在colnames变量中有列名,但我不知道如何在其中输入。同样,目标是使用spark的内置CSV写入功能DAtaFrame输出CSV文件“等效”(许多部分文件没问题)。 (Spark 2.3.0是驻留的。)实数将理想地转换为int,并且没有任何数据值的引号。但目前,2到7列转换是一个非常棘手的问题。感谢您的提示。

1 个答案:

答案 0 :(得分:1)

简单转换为纯Python类型和解包应该可以解决问题:

Xirm.rows.map(lambda x: (lu[x.index], *x.vector.toArray().tolist()))

相同
Xirm.rows.map(lambda x: [lu[x.index]] + x.vector.toArray().tolist())