E.g
sqlContext = SQLContext(sc)
sample=sqlContext.sql("select Name ,age ,city from user")
sample.show()
上述声明在终端上打印整个表格,但我想使用 for或while 访问该表格中的每一行以执行进一步的计算。
答案 0 :(得分:34)
您将定义自定义函数并使用map。
def customFunction(row):
return (row.name, row.age, row.city)
sample2 = sample.rdd.map(customFunction)
或
sample2 = sample.rdd.map(lambda x: (x.name, x.age, x.city))
然后,自定义函数将应用于数据帧的每一行。请注意,sample2将是RDD
,而不是数据框。
如果要执行更复杂的计算,则需要Map。如果您只需要添加派生列,则可以使用withColumn
,并返回数据帧。
sample3 = sample.withColumn('age2', sample.age + 2)
答案 1 :(得分:25)
你根本做不到。 DataFrames
与其他分布式数据结构相同,不是iterable,只能使用专用的高阶函数和/或SQL方法进行访问。
您当然可以collect
for row in df.rdd.collect():
do_something(row)
或转换toLocalIterator
for row in df.rdd.toLocalIterator():
do_something(row)
并如上所示在本地迭代,但它胜过使用Spark的所有目的。
答案 2 :(得分:6)
使用python中的列表推导,您可以使用两行将整列值收集到列表中:
df = sqlContext.sql("show tables in default")
tableList = [x["tableName"] for x in df.rdd.collect()]
在上面的例子中,我们返回数据库'default'中的表列表,但是可以通过替换sql()中使用的查询来修改相同的表。
或更简陋:
tableList = [x["tableName"] for x in sqlContext.sql("show tables in default").rdd.collect()]
对于三列的示例,我们可以创建一个字典列表,然后在for循环中迭代它们。
sql_text = "select name, age, city from user"
tupleList = [{name:x["name"], age:x["age"], city:x["city"]}
for x in sqlContext.sql(sql_text).rdd.collect()]
for row in tupleList:
print("{} is a {} year old from {}".format(
row["name"],
row["age"],
row["city"]))
答案 3 :(得分:2)
如果要对DataFrame对象中的每一行执行某些操作,请使用map
。这将允许您对每一行执行进一步的计算。它相当于从0
到len(dataset)-1
循环整个数据集。
请注意,这将返回PipelinedRDD,而不是DataFrame。
答案 4 :(得分:2)
这可能不是最佳实践,但是您可以简单地使用collect()
定位特定列,将其导出为行列表,然后遍历该列表。
假设这是您的df:
+----------+----------+-------------------+-----------+-----------+------------------+
| Date| New_Date| New_Timestamp|date_sub_10|date_add_10|time_diff_from_now|
+----------+----------+-------------------+-----------+-----------+------------------+
|2020-09-23|2020-09-23|2020-09-23 00:00:00| 2020-09-13| 2020-10-03| 51148 |
|2020-09-24|2020-09-24|2020-09-24 00:00:00| 2020-09-14| 2020-10-04| -35252 |
|2020-01-25|2020-01-25|2020-01-25 00:00:00| 2020-01-15| 2020-02-04| 20963548 |
|2020-01-11|2020-01-11|2020-01-11 00:00:00| 2020-01-01| 2020-01-21| 22173148 |
+----------+----------+-------------------+-----------+-----------+------------------+
循环遍历“日期”列中的行:
rows = df3.select('Date').collect()
final_list = []
for i in rows:
final_list.append(i[0])
print(final_list)
答案 5 :(得分:1)
以上
tupleList = [{name:x["name"], age:x["age"], city:x["city"]}
应该是
tupleList = [{'name':x["name"], 'age':x["age"], 'city':x["city"]}
name
,age
和city
的不是变量,只是字典的键。
答案 6 :(得分:1)
result = spark.createDataFrame([('SpeciesId','int'), ('SpeciesName','string')],["col_name", "data_type"]); for f in result.collect(): print (f.col_name)