从 numpy 到二维数组创建 pyspark 数据框

问题描述 投票:0回答:2

嗨,我有多个具有以下形状和格式的 numpy 数组。

print(user_feature.shape)
print(service_id.shape)
print(target_id.shape)
print(target_label.shape)
print(service_label.shape)

Output:
(4621998, 620)
(4621998, 7)
(4621998,)
(4621998,)
(4621998, 7)


print(user_feature)
print(service_id)
print(target_id)
print(target_label)
print(service_label)

[[ 1.33677050e-02 -1.45685431e-02 -2.30765194e-02 ...  0.00000000e+00
   0.00000000e+00  1.16669689e-04]
 [ 1.33677050e-02 -1.45685431e-02 -2.30765194e-02 ...  0.00000000e+00
   0.00000000e+00  1.16669689e-04]
 [ 1.33677050e-02 -1.45685431e-02 -2.30765194e-02 ...  0.00000000e+00
   0.00000000e+00  1.16669689e-04]
 ...
 [-5.55971265e-03  6.94929948e-03 -2.85931975e-02 ...  1.36206508e-01
   4.67081647e-03  7.43526791e-04]
 [-5.55971265e-03  6.94929948e-03 -2.85931975e-02 ...  1.36206508e-01
   4.67081647e-03  7.43526791e-04]
 [-5.55971265e-03  6.94929948e-03 -2.85931975e-02 ...  1.36206508e-01
   4.67081647e-03  7.43526791e-04]]
[[215. 215. 215. ... 554. 215. 215.]
 [215. 215. 215. ... 215. 215. 215.]
 [215. 215. 554. ... 215. 215. 215.]
 ...
 [116. 116. 149. ... 149.  44.  44.]
 [116. 149. 116. ...  44.  44. 297.]
 [149. 116. 149. ...  44. 297. 297.]]
[215. 215. 554. ... 297. 297. 176.]
[1. 1. 1. ... 1. 1. 1.]
[[1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]
 ...
 [2. 5. 1. ... 1. 1. 1.]
 [5. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]]

所以我尝试垂直合并这个数组并创建一个 pyspark 数据框,如下所示,这是我正在尝试的,我已经定义了一个架构并使用它来创建数据框,但是我遇到了以下错误。我还尝试将单个 numpy 数组转换为 df (稍后合并所有 df),但在模式上出现相同的错误。我在这里缺少什么?

schema_fc = StructType( [ StructField("user_feature", ArrayType( ArrayType(FloatType()) ), False), 
                          StructField("sequence_service_id_list",  ArrayType( ArrayType(FloatType()) ), False), 
                          StructField("target_service_id",   ArrayType(FloatType() ) , False),
                          StructField("target_label",   ArrayType(FloatType() ) , False), 
                          StructField("sequence_label_list",  ArrayType( ArrayType(FloatType() ) ), False)] )

df = spark.createDataFrame(zip(train_user_feature, train_sequence_service_id_list, train_target_service_id, train_target_label, train_sequence_label_list), schema_fc)

无法执行第2行: df = Spark.createDataFrame(zip(train_user_feature, train_sequence_service_id_list, train_target_service_id, train_target_label, train_sequence_label_list), schema_fc) 回溯(最近一次调用最后一次): 文件“/tmp/1692220704218-0/zeppelin_python.py”,第 158 行,位于 执行(代码,_zcUserQueryNameSpace) 文件“”,第 2 行,位于 文件“/usr/lib/spark/python/pyspark/sql/session.py”,第 675 行,在 createDataFrame 中 返回 self._create_dataframe(数据、模式、samplingRatio、verifySchema) 文件“/usr/lib/spark/python/pyspark/sql/session.py”,第 700 行,在 _create_dataframe 中 rdd, schema = self._createFromLocal(map(准备, 数据), schema) 文件“/usr/lib/spark/python/pyspark/sql/session.py”,第 509 行,在 _createFromLocal 中 数据 = 列表(数据) 文件“/usr/lib/spark/python/pyspark/sql/session.py”,第 682 行,准备中 验证函数(对象) 文件“/usr/lib/spark/python/pyspark/sql/types.py”,第 1409 行,在验证中 验证值(对象) 文件“/usr/lib/spark/python/pyspark/sql/types.py”,第 1390 行,在 verify_struct 中 验证者(v) 文件“/usr/lib/spark/python/pyspark/sql/types.py”,第 1409 行,在验证中 验证值(对象) 文件“/usr/lib/spark/python/pyspark/sql/types.py”,第 1352 行,在 verify_array 中 验证可接受的类型(obj) 文件“/usr/lib/spark/python/pyspark/sql/types.py”,第 1292 行,位于 verify_acceptable_types 中 % (数据类型, obj, 类型(obj)))) TypeError:字段 user_feature:ArrayType(ArrayType(FloatType,true),true)无法接受对象数组([ 1.33677050e-02,-1.45685431e-02,-2.30765194e-02,-5.82330208e-03, -3.32775936e-02、-2.07596943e-02、-2.37267348e-04、-4.20683017e-03、 -4.34294827e-02、7.81743042e-03、1.68688912e-02、-1.24656968e-02、 4.02029790e-03、3.12208608e-02、-4.03045630e-03、2.28498932e-02、 1.13157155e-02、1.06274318e-02、-8.11346527e-03、-6.98270462e-03、 -3.91414156e-03、-8.35975632e-03、1.49020925e-05、-7.33336899e-03、 8.67067836e-03、-2.28234846e-03、5.22214249e-02、1.39330365e-02、 3.98872644e-02、6.10537268e-03、2.20239125e-02、-1.11836568e-03、 -1.80659704e-02、-1.99369527e-02、2.31389888e-02、-4.65059280e-02、 2.19357051e-02、-2.52697505e-02、1.59132443e-02、2.98593007e-02、 3.99250053e-02、4.35081795e-02、1.41635444e-02、-1.70806684e-02、 1.30436081e-03、-1.31941019e-02、1.14841061e-02、5.76580316e-02、 2.16435902e-02、-4.92058229e-03、-3.88808325e-02、2.62990035e-02、 -1.39478920e-02、8.46350566e-04、3.43511552e-02、-1.80143528e-02、 -4.80983080e-03、1.50774773e-02、2.53398716e-02、2.06974316e-02、 7.26055726e-03、-4.74966839e-02、2.62531005e-02、1.31620280e-02、 -8.68222490e-03、-1.43548492e-02、9.61813331e-03、-2.14950927e-02、 1.20869037e-02、7.72804953e-04、-2.06626896e-02、1.97541751e-02、 2.28899159e-02、-1.63509734e-02、6.25781249e-04、2.29061060e-02、 2.55851950e-02、6.25669882e-02、2.07121912e-02、1.52262878e-02、 -4.50072298e-03、-2.88834609e-03、-7.85173662e-03、-3.19551006e-02、 -1.96053647e-02、2.16488615e-02、-1.82419382e-02、-8.35052226e-03、 8.67485628e-03、-6.06879368e-02、1.43139064e-02、1.74148679e-02、 7.30755646e-03、2.66504586e-02、3.40831396e-03、2.75030751e-02、 1.13305971e-02、-4.58726063e-02、1.36343203e-02、3.14601064e-02、 -1.86643917e-02、-2.10148469e-03、-4.82135266e-02、2.11269110e-02、 1.60128847e-02、3.05281598e-02、1.86553858e-02、-3.48868184e-02、 -3.12457476e-02、-8.56714416e-03、5.18892147e-02、3.10956426e-02、 -1.29655236e-03、1.91727206e-02、7.09275994e-03、-2.15799417e-02、 3.56485695e-02、1.97729263e-02、-2.52993172e-03、4.34201807e-02、 2.76413155e+00、0.00000000e+00、0.00000000e+00、1.16669689e-04]),类型为

预期产量

user_feature    service_id  target_id   target_label    service_label
[ 1.33677050e-02 -1.45685431e-02 -2.30765194e-02 ...  0.00000000e+00    0.00000000e+00  1.16669689e-04] [215. 215. 215. ... 554. 215. 215.] [1. 1. 1. ... 1. 1. 1.] [215. 215. 554. ... 297. 297. 176.] [5. 1. 1. ... 1. 1. 1.]
[ 1.33677050e-02 -1.45685431e-02 -2.30765194e-02 ...  0.00000000e+00    0.00000000e+00  7.43526791e-04] [215. 215. 554. ... 215. 215. 215.] [1. 1. 1. ... 1. 1. 1.] [215. 215. 554. ... 297. 297. 176.] [5. 1. 1. ... 1. 1. 1.]
[ 1.33677050e-02 -1.45685431e-02 -2.30765194e-02 ...  0.00000000e+00    0.00000000e+00  2.16669689e-04] [215. 215. 554. ... 215. 215. 215.] [1. 1. 1. ... 1. 1. 1.] [215. 215. 554. ... 297. 297. 176.] [5. 1. 1. ... 1. 1. 1.]
[ 1.33677050e-02 -1.45685431e-02 -2.30765194e-02 ...  0.00000000e+00    0.00000000e+00  1.16669689e-04] [215. 215. 554. ... 215. 215. 215.] [1. 1. 0. ... 1. 1. 1.] [215. 215. 554. ... 297. 297. 176.] [6. 1. 1. ... 1. 1. 1.]
python pandas numpy pyspark numpy-ndarray
2个回答
1
投票

您可以使用 JsonDF Package Json 对象创建包含这些数据的 Json,并使用输出将其数据化。

代码将类似于以下内容:

from JsonDF.utils.Json.Json import Json

json_data = Json('json_data', {'user_feature': user_feature,
                               'service_id': service_id,
                               'target_id': target_id,
                               'target_label': target_label,
                               'service_label': service_label}).objectify()

json_data 的输出是一个 json_string,您可以将它与 pandas 一起使用以将其加载到数据框中。

JsonDF 的代码位于 GitHub 上,或者您可以使用以下命令从 pip 安装:

pip install JsonDF
但请参阅 GitHub 中的自述文件和代码,了解一下它的工作原理。


0
投票

您可以将其转换为 Pandas 数据框,然后使用 koalas。它应该自动随 pyspark >= 3.2 一起提供,对于早期版本的 pyspark 可以使用这个:

import koalas as ks
spark_df = ks.from_pandas(pandas_df)
© www.soinside.com 2019 - 2024. All rights reserved.