pyspark允许您在使用以下方法从Dataframe返回单行时创建字典。
t=spark.sql("SET").withColumn("rw",expr("row_number() over(order by key)")).collect()[0].asDict()
print(t)
print(t["key"])
print(t["value"])
print(t["rw"])
print("Printing using for comprehension")
[print(t[i]) for i in t ]
Results:
{'key': 'spark.app.id', 'value': 'local-1594577194330', 'rw': 1}
spark.app.id
local-1594577194330
1
Printing using for comprehension
spark.app.id
local-1594577194330
1
我在scala spark也试过。可以使用case类方法。
case class download(key:String, value:String,rw:Long)
val t=spark.sql("SET").withColumn("rw",expr("row_number() over(order by key)")).as[download].first
println(t)
println(t.key)
println(t.value)
println(t.rw)
结果:
download(spark.app.id,local-1594580739413,1)
spark.app.id
local-1594580739413
1
在实际问题中,我有将近200多列,不想使用case类方法。我正在尝试下面这样的方法来避免case类选项。
val df =spark.sql("SET").withColumn("rw",expr("row_number() over(order by key)"))
(df.columns).zip(df.take(1)(0))
但是有个错误。
<console>:28: error: type mismatch;
found : (String, String, Long)
required: Iterator[?]
(df.columns.toIterator).zip(df.take(1)(0))
有没有办法解决这个问题。
2条答案
按热度按时间xggvc2p61#
问题是
zip
是一个集合上的方法,该方法只能接受另一个实现iterableonce的集合对象,并且df.take(1)(0)
是SparksqlRow
,不属于这一类。尝试将行转换为
Seq
使用itstoSeq
方法。结果:
nukf8bse2#
在scala中,有一种方法
getValuesMap
转换row
进入Map[columnName: String, columnValue: T]
. 尝试使用以下相同的方法-