如何在不使用RDD api的情况下摆脱pyspark数据帧中的行包装器对象?

时间:2016-11-01 19:48:27

标签: python apache-spark pyspark apache-spark-sql spark-dataframe

我针对tempview发布以下SQL语句

cloudantdata.createOrReplaceTempView("washingflat")

sqlDF = spark.sql("SELECT temperature FROM washingflat")
sqlDF.rdd.map(lambda row : row.temperature).collect()

我只对普通(未包装)整数值感兴趣。到目前为止,我所有尝试过的数据帧API总是会返回包含我感兴趣的值的行对象。

有没有办法在不使用RDD api的情况下获取标量内容?

4 个答案:

答案 0 :(得分:2)

您可以按照以下方式手动将它们放入列表中

temps = []
rows = sqlDF.collect()
for r in rows:
    temps.append(r['temperature'])

答案 1 :(得分:1)

尝试:

>>> from itertools import chain
>>>
>>> chain.from_iterable(sqlDF.collect())

答案 2 :(得分:1)

给定一个输入DataFrame

import numpy as np
import pandas as pd
test_df = pd.DataFrame({'Age': np.random.uniform(0,100, size = (100,)), 'City': 'LA'})
sqlContext.createDataFrame(test_df).registerTempTable('AgeTable')

有两种(主要)方法可以在不使用Row抽象的情况下提取值。第一种是使用DataFrame / SQL查询的.toPandas()方法

print(sqlContext.sql("SELECT Age FROM AgeTable").toPandas()['Age'])

这会返回一个Pandas DataFrame / Series。

第二种是将数据实际分组到SQL中,然后从单个Row对象中提取它

al_qry = sqlContext.sql("SELECT City, COLLECT_SET(Age) as AgeList FROM AgeTable GROUP BY City")
al_qry.first()[0].AgeList

返回原始python列表。

使用toPandas方法的效率更高,未来这种方法可能会有所改进。

答案 3 :(得分:0)

temp_list = [str(i.temperature) for i in sqlDF.select("temperatue").collect()]