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有所不同
答案 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']
注意:如果这不是您的确切问题,请提供实际和预期的输出结果