2015-04-03 192 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