pyspark sql не может скопировать столбец возраста в dataframe - PullRequest
0 голосов
/ 16 мая 2019

Я проходил через скрипт pyspark-sql в моем учебнике, который выглядит следующим образом:

dff = sqlCtx.read.format("com.databricks.spark.csv").option("header", "true").option("inferSchema","true").option("delimiter","\t").load("/home/hduser/Desktop/allFromDesktop/pyspark/creditData.csv")

Result:
+---+------------------+-----+------+-----+---+---------+------+-------+-------+----------------+-------+---------+
|_c0|            Income|Limit|Rating|Cards|Age|Education|Gender|Student|Married|       Ethnicity|Balance|Age_class|
+---+------------------+-----+------+-----+---+---------+------+-------+-------+----------------+-------+---------+
|  0|14.890999999999998| 3606|   283|    2| 34|       11|  Male|     No|    Yes|       Caucasian|    333|    25-34|
|  1|           106.025| 6645|   483|    3| 82|       15|Female|    Yes|    Yes|           Asian|    903|      65+|
|  2|104.59299999999999| 7075|   514|    4| 71|       11|  Male|     No|     No|           Asian|    580|      65+|

Затем следует скрипт:

tab=dff.select(['Age_class','Balance','Limit']).groupby('Age_class','Limit').agg(F.count('Limit')
    ,F.mean('Limit').alias('Limit_avg'),
    F.min('Limit').alias('Limit_min'),
    F.max('Limit').alias('Limit_max')).withColumn('total',sum(col('Limit')).over(Window)).withColumn('Percent',col('Limit')*100/col('total')).drop(col('total'))
    tab.show()

Результирующий ::

+---------+-----+------------+---------+---------+---------+-------------------+
|Age_class|Limit|count(Limit)|Limit_avg|Limit_min|Limit_max|            Percent|
+---------+-----+------------+---------+---------+---------+-------------------+
|    45-54| 7838|           1|   7838.0|     7838|     7838| 0.4137807247233719|
|    35-44|  886|           1|    886.0|      886|      886|0.04677337612974069|
|    45-54| 4632|           1|   4632.0|     4632|     4632|  0.244530788073317|
|    55-64| 1448|           1|   1448.0|     1448|     1448|0.07644226708336853|
**Here in this result you can see that column 'Age_class' is not binned/grouped into classes the data type for "Age_col " is String.

Здесь я хочу пояснить, что столбец «limit» в предложении groupby изначально не существовал, но во время выполнения вышеописанного скрипта я получил ошибку, что «переменная» Limit »не может быть разрешена», а также оригинальный столбец «Limit»меняли / удаляли .alias'es, так что в конце концов я использовал groupby ('Age_class', 'Limit').После выполнения сценария я получил окончательный результат, в котором переменная «Age_class» неправильно распределена / сгруппирована, поскольку я ожидала, что она будет объединена в классы:

Expected "Age_class" column
    +---------+------------+------------------+---------+---------+
    |Age_class|count(Limit)|         Limit_avg|Limit_min|Limit_max|
    +---------+------------+------------------+---------+---------+
    |    45-54|          65| 4836.630769230769|      855|    11200|
    |      <25|          11|3932.6363636363635|     2120|     6375|
    |    55-64|          68|            4530.0|     1311|    11966|
    |    35-44|          71| 4884.140845070423|      886|    13414|
    |    25-34|          45|            4280.0|      855|     8117|
    |      65+|         140| 4922.757142857143|     1134|    13913|
    +---------+------------+------------------+---------+---------+
...