2015-04-03 189 views
0

我试图做一个过滤器操作来获取所有行,其中我的变量国家的长度小于4,并且无论我做什么都不断收到错误。Spark - 行元素的长度

这是当前代码(使用Python API)

uniqueRegions = sqlContext.sql("SELECT country, city FROM df") 
uniqueRegions = uniqueRegions.rdd 
uniqueRegions = uniqueRegions.distinct() 
uniqueRegions = uniqueRegions.filter(lambda line: len(line.country) < 4) 

这是错误 TypeError: object of type 'NoneType' has no len()

在第一行(与rdd.first完成): Row(country=u'xxxxxx', city=u'xxxxxx')

任何建议关于如何解决这个问题? 谢谢。

+0

'sqlContext.sql(“SELECT country,city FROM df WHERE len(country)<4”)''应该这样做。 – 2015-04-03 15:29:49

+0

嗨。不幸的是,len还不支持Spark SQL,https://issues.apache.org/jira/browse/SPARK-2686 – user3276768 2015-04-03 15:33:14

+0

'coll = uniqueRegions.distinct()。collect()'和'filter(lambda x:len (x [0])<4,coll)'可能会有所帮助。我不知道RDD有什么。 – 2015-04-03 15:47:06

回答

1

您有一个国家为NULL的数据库记录。这个长度没有意义。在没有国家设置的情况下该怎么办?

也许你想筛选记录? SELECT country, city FROM df WHERE country IS NOT NULL?或者,也许lambda l: l.country is not None and len(l.country) < 4,或取决于你的逻辑,lambda l: l.country is None or len(l.country) < 4

+0

这个国家实际上是一个国家代码(美国,ITA等等),所以它们全都有3个,问题是有些条目是国家的实际名称,我想过滤掉这些。没有东西是空的。 – user3276768 2015-04-03 15:00:08

+0

你说得对,我有几个空条目。再次感谢。 – user3276768 2015-04-03 15:47:48

+0

Ick,你应该在一个表中按国家代码列出国家代码,并且强制这个表的国家/地区字段不为NULL,并且具有FOREIGN KEY countries.id。 – 2015-04-03 16:21:07