Разбор строк и изоляция студенческих записей из Spark Dataframe - PullRequest
0 голосов
/ 23 октября 2019

В моей базе данных учеников есть несколько записей для каждого ученика в таблице Ученик.

Я читаю данные в массив данных Spark, а затем перебираю кадр данных Spark, изолирую записи для каждого ученика и выполняю некоторую обработку длякаждый студент записывает.

Мой код пока:

from pyspark.sql import SparkSession
spark_session = SparkSession \
    .builder \
    .appName("app") \
    .config("spark.jars.packages", "org.apache.hadoop:hadoop-aws:2.7.2") \
    .getOrCreate()

class_3A = spark_session.sql("SQL") 

for row in class_3A:
    #for each student
        #Print Name, Age and Subject Marks

Как мне это сделать?

Ответы [ 4 ]

2 голосов
/ 23 октября 2019

Другой подход заключается в использовании SparkSQL

>>> df = spark.createDataFrame([('Ankit',25),('Jalfaizy',22),('Suresh',20),('Bala',26)],['name','age'])
>>> df.show()
+--------+---+                                                                  
|    name|age|
+--------+---+
|   Ankit| 25|
|Jalfaizy| 22|
|  Suresh| 20|
|    Bala| 26|
+--------+---+

>>> df.where('age > 20').show()
+--------+---+
|    name|age|
+--------+---+
|   Ankit| 25|
|Jalfaizy| 22|
|    Bala| 26|
+--------+---+

>>> from pyspark.sql.functions import *
>>> df.select('name', col('age') + 100).show()
+--------+-----------+
|    name|(age + 100)|
+--------+-----------+
|   Ankit|        125|
|Jalfaizy|        122|
|  Suresh|        120|
|    Bala|        126|
+--------+-----------+
1 голос
/ 23 октября 2019

Императивный подход (в дополнение к SQL-подходу Bala):

class_3A = spark_session.sql("SQL") 

def process_student(student_row):
    # Do Something with student_row
    return processed_student_row

#"isolate records for each student"
# Each student record will be passed to process_student function for processing.
# Results will be accumulated to a new DF - result_df
result_df = class_3A.map(process_student)

# If you don't care about results and just want to do some processing:
class_3A.foreach(process_student)
0 голосов
/ 23 октября 2019

Не уверен, правильно ли я понял вопрос, но если вы хотите выполнить операцию со строками на основе любого столбца, вы можете сделать это, используя функции dataframe. Пример:

from pyspark.sql import SparkSession
import pyspark.sql.functions as f
from  pyspark.sql import Window



sc = SparkSession.builder.appName("example").\
config("spark.driver.memory","1g").\
config("spark.executor.cores",2).\
config("spark.max.cores",4).getOrCreate()

df1 = sc.read.format("csv").option("header","true").load("test.csv")

w = Window.partitionBy("student_id")

df2 = df1.groupBy("student_id").agg(f.sum(df1["marks"]).alias("total"))
df3 = df1.withColumn("max_marks_inanysub",f.max(df1["marks"]).over(w))
df3 = df3.filter(df3["marks"] == df3["max_marks_inanysub"])


df1.show()
df3.show()

образец данных

student_id, предмет, оценки 1, математика, 3 1, наука, 6 2, математика, 4 2, наука, 7

вывод

+ ---------- + ------- + ----- + | student_id | subject | mark |+ ---------- + ------- + ----- + |1 |математика |3 ||1 | наука |6 ||2 |математика |4 ||2 | наука |7 |+ ---------- + ------- + ----- +

+ ---------- + ------- + ----- + ------------------ + | student_id | предмет | оценки | max_marks_inanysub |+ ---------- + ------- + ----- + ------------------ + |1 | наука |6 |6 ||2 | наука |7 |7 |+ ---------- + ------- + ----- + ------------------ +

0 голосов
/ 23 октября 2019

Вы можете циклически проходить по каждой записи в кадре данных и получать к ним доступ с именами столбцов

from pyspark.sql import Row
from pyspark.sql.functions import *
l = [('Ankit',25),('Jalfaizy',22),('Suresh',20),('Bala',26)]
rdd = sc.parallelize(l)
people = rdd.map(lambda x: Row(name=x[0], age=int(x[1])))
schemaPeople = spark.createDataFrame(people)

schemaPeople.show(10, False)

for row in schemaPeople.rdd.collect():
  print("Hi " + str(row.name) + " your age is : " + str(row.age) )

. Это приведет к выводу, как показано ниже

+---+--------+
|age|name    |
+---+--------+
|25 |Ankit   |
|22 |Jalfaizy|
|20 |Suresh  |
|26 |Bala    |
+---+--------+

Hi Ankit your age is : 25
Hi Jalfaizy your age is : 22
Hi Suresh your age is : 20
Hi Bala your age is : 26

Таким образом, вы можете выполнять свою обработкуили какую-то логику, которую вам нужно выполнить для каждой записи вашего информационного кадра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...