如何在不使用 RDD api 的情况下摆脱 pyspark 数据帧中的行包装器对象?
How to get rid of the row wrapper object in pyspark dataframes without using RDD api?
我针对临时视图
发出以下SQL声明
cloudantdata.createOrReplaceTempView("washingflat")
sqlDF = spark.sql("SELECT temperature FROM washingflat")
sqlDF.rdd.map(lambda row : row.temperature).collect()
我只对普通(展开的)整数值感兴趣。到目前为止,我对数据框所做的所有尝试 API 总是返回包含我感兴趣的值的行对象。
有没有不使用 RDD 就可以获取标量内容的方法 api?
尝试:
>>> from itertools import chain
>>>
>>> chain.from_iterable(sqlDF.collect())
您可以在收集后手动将它们放入列表中,如下所示
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')
有两种(主要)方法可以在不使用 Row 抽象的情况下提取值。第一种是使用DataFrame的.toPandas()
方法/SQLQuery
print(sqlContext.sql("SELECT Age FROM AgeTable").toPandas()['Age'])
这个returns一个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
这是一个 returns 原始 python 列表。
更有效的方法是使用 toPandas
方法,这种方法将来可能会得到更多改进。
temp_list = [str(i.temperature) for i in sqlDF.select("temperatue").collect()]
我针对临时视图
发出以下SQL声明cloudantdata.createOrReplaceTempView("washingflat")
sqlDF = spark.sql("SELECT temperature FROM washingflat")
sqlDF.rdd.map(lambda row : row.temperature).collect()
我只对普通(展开的)整数值感兴趣。到目前为止,我对数据框所做的所有尝试 API 总是返回包含我感兴趣的值的行对象。
有没有不使用 RDD 就可以获取标量内容的方法 api?
尝试:
>>> from itertools import chain
>>>
>>> chain.from_iterable(sqlDF.collect())
您可以在收集后手动将它们放入列表中,如下所示
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')
有两种(主要)方法可以在不使用 Row 抽象的情况下提取值。第一种是使用DataFrame的.toPandas()
方法/SQLQuery
print(sqlContext.sql("SELECT Age FROM AgeTable").toPandas()['Age'])
这个returns一个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
这是一个 returns 原始 python 列表。
更有效的方法是使用 toPandas
方法,这种方法将来可能会得到更多改进。
temp_list = [str(i.temperature) for i in sqlDF.select("temperatue").collect()]