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



我对tempview发出以下SQL语句

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

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

是否有一种方法来获得标量内容,而不使用RDD api?

您可以在收集它们后手动将它们放入列表中,如下所示

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

给定一个输入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')

有两种(主要)方法可以在不使用行抽象的情况下提取值。第一种是使用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方法,这种方法在未来可能会得到更多的改进。

尝试:

>>> from itertools import chain
>>>
>>> chain.from_iterable(sqlDF.collect())
temp_list = [str(i.temperature) for i in sqlDF.select("temperatue").collect()]

相关内容

  • 没有找到相关文章