Spark初学者求助:如何不使用Pandas提取DataFrame行的列值
解决PySpark中遍历Row数组提取列值的问题
嘿,刚接触Spark的话确实容易把Java/Scala的API和PySpark搞混~你遇到的问题是因为PySpark里的Row对象并没有getString()这个方法,那是Scala版本里的用法。不用Pandas的话,有几种简单的方式可以提取列值:
通过索引直接访问
PySpark的Row对象支持像普通数组一样通过索引取值,索引从0开始,对应你要的第二列(索引1)的话,直接写:for row in Arr: print(row[1])通过列名访问(更直观)
如果你的CSV文件有表头,读取的时候记得加上header=True参数,这样DataFrame会自动带上列名:df = sqlcontext.read.csv(path, header=True)之后就可以通过列名直接提取值,两种写法都可以:
# 方式1:字典式访问 for row in Arr: print(row['你的列名']) # 方式2:属性式访问 for row in Arr: print(row.你的列名)如果CSV没有表头,Spark会默认给列命名为
_c0、_c1、_c2...,那你就可以用row['_c1']来取第二列的值。额外提醒:关于collect()的注意事项
虽然collect()能把DataFrame转成Row数组,但它会把所有数据拉到Driver节点的内存中,如果你的DataFrame数据量很大,很容易出现内存溢出的问题。如果是处理大数据集,更推荐用df.foreach()或者df.foreachPartition()来分布式处理数据,比如:def process_row(row): print(row[1]) df.foreach(process_row)
内容的提问来源于stack exchange,提问作者Heether
相关产品推荐
相关产品推荐

