将 numpy 数组的 DataFrame 转换为 Spark DataFrame

mik*_*keL 3 python apache-spark pyspark

我有一个由一列整数和另一列 numpy 数组组成的 Pandas DataFrame

DataFrame({'col_1':[1434,3046,3249,3258], 'col_2':[np.array([1434, 1451, 1467]),np.array([3046, 3304]),
    np.array([3249, 3246, 3298, 3299, 3220]),np.array([3258, 3263, 3307])]})


   col_1    col_2
0   1434    [1434, 1451, 1467]
1   3046    [3046, 3304]
2   3249    [3249, 3246, 3298, 3299, 3220]
3   3258    [3258, 3263, 3307]
Run Code Online (Sandbox Code Playgroud)

我想转换为以下格式的 Spark DataFrame

df=sc.parallelize([  [1434,[1434, 1451, 1467]],
          [3046,[3046, 3304]],
          [3249,[3046, 3304]],
          [3258,[3258, 3263, 3307]]]).toDF(['col_1','col_2'])


df.select('col_1',explode(col('col_2')).alias('col_2')).show(14)


+-----+-----+
|col_1|col_2|
+-----+-----+
| 1434| 1434|
| 1434| 1451|
| 1434| 1467|
| 3046| 3046|
| 3046| 3304|
| 3249| 3046|
| 3249| 3304|
| 3258| 3258|
| 3258| 3263|
| 3258| 3307|
+-----+-----+
Run Code Online (Sandbox Code Playgroud)

如果我尝试将 Pandas DataFrame 直接转换为 Spark DataFrame,则会出现错误

not supported type: <type 'numpy.ndarray'>
Run Code Online (Sandbox Code Playgroud)

tit*_*ata 5

我想一种方法是将 DataFrame 中的每一行转换为整数列表。

df.col_2 = df.col_2.map(lambda x: [int(e) for e in x])
Run Code Online (Sandbox Code Playgroud)

然后,直接将其转换为 Spark DataFrame

df_spark = spark.createDataFrame(df)
df_spark.select('col_1', explode(col('col_2')).alias('col_2')).show(14)
Run Code Online (Sandbox Code Playgroud)