在python输出中执行相同操作应与scala输出相同

时间:2019-11-25 09:48:12

标签: python-3.x pyspark

LINK TO data.csv 在scala中,代码给出了一个字符串数组,但是在python中,我想要像scala一样的输出: Scala中的代码:

val spark = SparkSession.builder()
      .appName("Test_Parquet")
      .master("local[*]")
      .getOrCreate()
    val sc = spark.sparkContext

    val parquetDF = spark.read.csv("data.csv")
    parquetDF.coalesce(1).write.mode("overwrite").parquet("Parquet")
    val rdd = spark.read.parquet("Parquet").rdd
    val header = rdd.first()

    val rdd1 = rdd.filter(_ != header).map(x => x.toString)
    rdd1.foreach(println)

输出:

  

[加拿大,47; 97; 33; 94; 6]       [加拿大,59; 98; 24; 83; 3]       [加拿大77; 63; 93; 86; 62]       [中国,86; 71; 72; 23; 27]       [中国,74; 69; 72; 93; 7]       [中国,58; 99; 90; 93; 41]       [英格兰,40; 13; 85; 75; 90]       [英格兰,39; 13; 33; 29; 14]       [英格兰,99; 88; 57; 69; 49]       [德国67; 93; 90; 57; 3]       [德国,0; 9; 15; 20; 19]       [德国77; 64; 46; 95; 48]       [印度,90; 49; 91; 14; 70]       [印度,70; 83; 38; 27; 16]       [印度,86; 21; 19; 59; 4]

Python代码:

spark = SparkSession.builder.appName("Test_Parquet").master("local[*]").getOrCreate()

parquetDF = spark.read.csv("data.csv")

parquetDF.coalesce(1).write.mode("overwrite").parquet("Parquet")
rdd = spark.read.parquet("Parquet").rdd
header = rdd.first()
print(header)
rdd1 = rdd.filter(lambda line: header != line).map(lambda x: str(x))
rdd1.foreach(print)

如果我在python中做相同的事情,则python的输出与scala有所不同

1 个答案:

答案 0 :(得分:2)

我认为rdd1.foreach(print)应该可以工作,但是由于您是从DataFrame进行转换的,因此您将获得Row对象。

我认为以下方法应该有效:

rdd1.map(list).foreach(print)

差异:

df.rdd.foreach(print)
# Row(Name='John', gender='Male', state='GA')
# Row(Name='Mary', gender='Female', state='GA')
# Row(Name='Alex', gender='Male', state='NY')
# Row(Name='Ana', gender='Female', state='NY')
# Row(Name='Amy', gender='Female', state='NY')

df.rdd.map(list).foreach(print)
# ['John', 'Male', 'GA']
# ['Mary', 'Female', 'GA']
# ['Alex', 'Male', 'NY']
# ['Ana', 'Female', 'NY']
# ['Amy', 'Female', 'NY']

注意如果这不是您的确切问题,请提供实际和预期的输出结果