Sehen Sie, warum diese Art und Weise, wie Sie es tun, nicht funktioniert. Zunächst versuchen Sie, eine Ganzzahl aus einem Zeilentyp abzurufen. Die Ausgabe Ihrer Sammlung sieht folgendermaßen aus:
>>> mvv_list = mvv_count_df.select('mvv').collect()
>>> mvv_list[0]
Out: Row(mvv=1)
Wenn Sie so etwas nehmen:
>>> firstvalue = mvv_list[0].mvv
Out: 1
Sie erhalten den mvv
Wert. Wenn Sie alle Informationen des Arrays möchten, können Sie Folgendes tun:
>>> mvv_array = [int(row.mvv) for row in mvv_list.collect()]
>>> mvv_array
Out: [1,2,3,4]
Wenn Sie jedoch dasselbe für die andere Spalte versuchen, erhalten Sie:
>>> mvv_count = [int(row.count) for row in mvv_list.collect()]
Out: TypeError: int() argument must be a string or a number, not 'builtin_function_or_method'
Dies geschieht, weil count
es sich um eine integrierte Methode handelt. Und die Spalte hat den gleichen Namen wie count
. Eine Problemumgehung hierfür ist das Ändern des Spaltennamens count
in _count
:
>>> mvv_list = mvv_list.selectExpr("mvv as mvv", "count as _count")
>>> mvv_count = [int(row._count) for row in mvv_list.collect()]
Diese Problemumgehung ist jedoch nicht erforderlich, da Sie über die Wörterbuchsyntax auf die Spalte zugreifen können:
>>> mvv_array = [int(row['mvv']) for row in mvv_list.collect()]
>>> mvv_count = [int(row['count']) for row in mvv_list.collect()]
Und es wird endlich funktionieren!
list(df.select('mvv').toPandas()['mvv'])
. Arrow wurde in PySpark integriert, was sichtoPandas
erheblich beschleunigte . Verwenden Sie nicht die anderen Ansätze, wenn Sie Spark 2.3+ verwenden. Weitere Benchmarking-Details finden Sie in meiner Antwort.