2016-10-22 6 views
0

私はこのpysparkは

+------+------------+ 
| fruit|fruit_number| 
+------+------------+ 
| apple|   20| 
|orange|   33| 
| pear|   27| 
| melon|   31| 
| plum|   8| 
|banana|   4| 
+------+------------+ 

のようなテーブルがあると私はこの

|fruit_number_range| number of types of fruit| 
    |less than 5  | 1      | 
    |less than 25  | 3      | 
    |more than 25  | 2      | 

Iのようなテーブルを生成したいデータの入ったバケツを生成するために、列の間隔値に新しいカラムベースを生成します1つの列の間隔値に基づいて新しい列を生成する方法があるかどうか疑問です。ここで

私はフルーツのテーブルを生成する方法のコードは次のとおりです。

from pyspark import SparkConf, SparkContext 
from pyspark.sql import SQLContext, HiveContext,Row 
sqlContext = HiveContext(sc) 
from pyspark.sql.types import StringType, IntegerType,  StructType, StructField,LongType 
from pyspark.sql.functions import sum, mean,col 


rdd = sc.parallelize([('apple', 20), 
('orange',33), 
('pear',27), 
('melon',31), 
('plum',8), 
('banana',4)]) 
schema = StructType([StructField('fruit', StringType(), True), 
      StructField('fruit_number', IntegerType(),True)]) 
df = sqlContext.createDataFrame(rdd, schema) 
+0

あなたは3つのバケット(= 25 <5, <25, >をカウントするUDF(ユーザー定義関数)を書くことができます)。例えば、バケットが均一である場合。 5,10,15,20,25,30 ...ヒストグラムと呼ばれます。 Google for Spark +のヒストグラム –

答えて

1
from pyspark import SparkConf, SparkContext 
from pyspark.sql import SQLContext, HiveContext,Row 
from pyspark.sql.types import StringType, IntegerType, StructType, StructField,LongType 
from pyspark.sql.functions import sum, mean,col, udf 

sc = SparkContext() 
sqlContext = HiveContext(sc) 

rdd = sc.parallelize([('apple', 20), 
         ('orange',33), 
         ('pear',27), 
         ('melon',31), 
         ('plum',8), 
         ('banana',4)]) 
schema = StructType([StructField('fruit', StringType(), True), 
        StructField('fruit_number', IntegerType(),True)]) 

df = sqlContext.createDataFrame(rdd, schema) 

def fruit_number_range(fruit_number): 
    if fruit_number < 5: 
     return 'less than 5' 
    elif fruit_number < 25: 
     return 'less than 25' 
    return 'more than 25' 

udf_fruit_number_range = udf(fruit_number_range, StringType()) 
df_w_range = df.withColumn("fruit_number_range", udf_fruit_number_range("fruit_number")) 

df_w_range.groupBy("fruit_number_range").count().show() 

結果

+------------------+-----+ 
|fruit_number_range|count| 
+------------------+-----+ 
|  less than 25| 2| 
|  less than 5| 1| 
|  more than 25| 3| 
+------------------+-----+ 
+0

それは動作します。私はTempTableとして登録し、SQLでこれを行うために使用しました。これは新しい方法です。ありがとう – newleaf