рдЕрдЬрдЧрд░ рдмрдирд╛рдо рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рд╕реНрдХрд╛рд▓рд╛ - рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдЕрдкреЗрдХреНрд╖рд┐рдд рдмреЗрдВрдЪрдорд╛рд░реНрдХ


рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдЖрдЬ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдордВрдЪ рд╣реИред рдЗрд╕рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдореЗрдВ рдХрд╛рдлреА рдпреЛрдЧрджрд╛рди рдкрд╛рдпрдерди рдХреЗ рддрд╣рдд рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рд╣рд░ рдХреЛрдИ рд╕рд╣рдордд рд╣реИ рдХрд┐ рдорд╛рдирдХ рдПрдкреАрдЖрдИ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рдкрд╛рдпрдерди рдФрд░ рд╕реНрдХрд╛рд▓рд╛ / рдЬрд╛рд╡рд╛ рдХреЛрдб рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рддреБрд▓рдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди, рдпреВрдбреАрдПрдл) рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдИ рдПрдХрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдПрд╕рдПрдирдП рд╣реИрдХрдереЙрди 2019 рд╕рдорд╛рдзрд╛рди рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдУрд╡рд░рд╣реЗрдб рд▓рд╛рдЧрдд рдХреИрд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред


рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рддрд┐рднрд╛рдЧреА рд╕реЛрд╢рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рдорд╛рдЪрд╛рд░ рдлреАрдб рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реЙрд░реНрдЯ рд╕реВрдЪреА рдХреЗ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд╛рдкреНрдд рд╕рдорд╛рдзрд╛рди рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ, рднрд░реА рд╣реБрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рдЖрд░рдУрд╕реА рдПрдпреВрд╕реА рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдФрд╕рдд рдореВрд▓реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрд░рдУрд╕реА рдПрдпреВрд╕реА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд - рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреИрдпрд╛рд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдгред


рдПрдХ рддреБрд▓рдирд╛ рдордВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╕реНрдерд╛рдиреАрдп рдореЛрдб рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдЪрд╛рд░ рдХреЛрд░ рдФрд░ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд▓рд╛рдЙрдб рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдо рдЕрдкрд╛рдЪреЗ рдЬрд╝реЗрдкреЗрд▓рд┐рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо PySpark рдФрд░ Scala Spark рдореЗрдВ рд╕рдорд╛рди рдХреЛрдб рдХреЛ рдорд┐рд░рд░ рдХрд░реЗрдВрдЧреЗред [рдпрд╣рд╛рдБ] рдЪрд▓реЛ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред


data = sqlContext.read.csv("sna2019/modelCappedSubmit") trueData = sqlContext.read.csv("sna2019/collabGt") toValidate = data.withColumnRenamed("_c1", "submit") \ .join(trueData.withColumnRenamed("_c1", "real"), "_c0") \ .withColumnRenamed("_c0", "user") \ .repartition(4).cache() toValidate.count() 

 val data = sqlContext.read.csv("sna2019/modelCappedSubmit") val trueData = sqlContext.read.csv("sna2019/collabGt") val toValidate = data.withColumnRenamed("_c1", "submit") .join(trueData.withColumnRenamed("_c1", "real"), "_c0") .withColumnRenamed("_c0", "user") .repartition(4).cache() toValidate.count() 

рдорд╛рдирдХ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреЛрдб рдХреА рд▓рдЧрднрдЧ рдкреВрд░реА рдкрд╣рдЪрд╛рди val рдХреАрд╡рд░реНрдб рддрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИред рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдХрд╛рдлреА рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реИред рдЕрдм рд╣рдо рдЬрд┐рд╕ UDF рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред


 parse = sqlContext.udf.register("parse", lambda x: [int(s.strip()) for s in x[1:-1].split(",")], ArrayType(IntegerType())) def auc(submit, real): trueSet = set(real) scores = [1.0 / (i + 1) for i,x in enumerate(submit)] labels = [1.0 if x in trueSet else 0.0 for x in submit] return float(roc_auc_score(labels, scores)) auc_udf = sqlContext.udf.register("auc", auc, DoubleType()) 

 val parse = sqlContext.udf.register("parse", (x : String) => x.slice(1,x.size - 1).split(",").map(_.trim.toInt)) case class AucAccumulator(height: Int, area: Int, negatives: Int) val auc_udf = sqlContext.udf.register("auc", (byScore: Seq[Int], gt: Seq[Int]) => { val byLabel = gt.toSet val accumulator = byScore.foldLeft(AucAccumulator(0, 0, 0))((accumulated, current) => { if (byLabel.contains(current)) { accumulated.copy(height = accumulated.height + 1) } else { accumulated.copy(area = accumulated.area + accumulated.height, negatives = accumulated.negatives + 1) } }) (accumulator.area).toDouble / (accumulator.negatives * accumulator.height) }) 

рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдХрд┐рдХрд┐рдЯ-рд▓рд░реНрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдХрд╛рд░рдгред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдкреНрд░рд┐рдп рдХреНрд╖рдг рд╣реИрдВ - рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрдмрдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЪрд▓реЛ рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВ:


 toValidate.select(auc_udf(parse("submit"), parse("real"))).groupBy().avg().show() 

 toValidate.select(auc_udf(parse($"submit"), parse($"real"))).groupBy().avg().show() 

рдХреЛрдб рд▓рдЧрднрдЧ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред



рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рдкрд░ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдиреЗ рд╕реНрдХрд╛рд▓рд╛ рдкрд░ рджреЛ рд╕реЗрдХрдВрдб рдХреЗ рдмрдЬрд╛рдп рдбреЗрдврд╝ рдорд┐рдирдЯ рдХрд╛рдо рдХрд┐рдпрд╛, рдпрд╛рдиреА рдкрд╛рдпрдерди 45 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ ред рджреМрдбрд╝рддреЗ рд╕рдордп, рд╢реАрд░реНрд╖ 4 рд╕рдХреНрд░рд┐рдп рдкрд╛рдпрдерди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреВрд░реА рдЧрддрд┐ рд╕реЗ рдЪрд▓ рд░рд╣реА рд╣реИрдВ, рдФрд░ рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЧреНрд▓реЛрдмрд▓ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рд▓реЙрдХ рдХреЛ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди! рд╢рд╛рдпрдж рд╕рдорд╕реНрдпрд╛ рд╕реНрдХрд┐рдЯрд┐рдЯ-рд▓рд░реНрди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣реИ - рдЪрд▓реЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛, рд╕рдЪрдореБрдЪ рдкрд╛рдпрдерди рдХреЛрдб рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


 def auc(submit, real): trueSet = set(real) height = 0 area = 0 negatives = 0 for candidate in submit: if candidate in trueSet: height = height + 1 else: area = area + height negatives = negatives + 1 return float(area) / (negatives * height) auc_udf_modified = sqlContext.udf.register("auc_modified", auc, DoubleType()) toValidate.select(auc_udf_modified(parse("submit"), parse("real"))).groupBy().avg().show() 


рдкреНрд░рдпреЛрдЧ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдПрдХ рдУрд░, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЛ рд╕рдорддрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл, рд▓реИрдХреЛрдирд┐рдЬрд╝реНрдо рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ред рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЕрддрд┐рд░рд┐рдХреНрдд C ++ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдпрдерди рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдУрд╡рд░рд╣реЗрдб рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЬрд╛рд╡рд╛ / рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдЬреЗрдПрдирдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╛рди рдУрд╡рд░рд╣реЗрдб рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп 45 рдмрд╛рд░ рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдирд╣реАрдВ рдерд╛ред


рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрдВрдЧреЗ: рдкреИрдХреЗрдЬ рдХреЗ рдЖрд╣реНрд╡рд╛рди рд╕реЗ рдпреЛрдЧрджрд╛рди рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рдмрд┐рдирд╛ рд╢реБрджреНрдз рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдкрд░рд┐рд╢реЛрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ рдореЗрдВ рдмрдврд╝реЗ рд╣реБрдП рдбреЗрдЯрд╛ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рддреБрд▓рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред


 def parse(x): return [int(s.strip()) for s in x[1:-1].split(",")] def auc(submit, real): trueSet = set(real) height = 0 area = 0 negatives = 0 for candidate in submit: if candidate in trueSet: height = height + 1 else: area = area + height negatives = negatives + 1 return float(area) / (negatives * height) def sklearn_auc(submit, real): trueSet = set(real) scores = [1.0 / (i + 1) for i,x in enumerate(submit)] labels = [1.0 if x in trueSet else 0.0 for x in submit] return float(roc_auc_score(labels, scores)) 


рд╕реНрдерд╛рдиреАрдп рдкрд╛рдпрдерди рдФрд░ рдкрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдУрд╡рд░рд╣реЗрдб рдХреА рдзрд╛рд░рдгрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреА - рдЬрдм рд╕реНрдХрд┐рдЯ-рд▓рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЧрддрд┐ 20 рдЧреБрдирд╛ рд╕реЗ рдЕрдзрд┐рдХ рдШрдЯ рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, 20 45 рдирд╣реАрдВ рд╣реИ - рдЪрд▓реЛ рдбреЗрдЯрд╛ рдХреЛ "рднрдбрд╝рдХрд╛рдиреЗ" рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдкрд╛рд░реНрдХ рдкреНрд░рджрд░реНрд╢рди рдХреА рдлрд┐рд░ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред


 k4 = toValidate.union(toValidate) k8 = k4.union(k4) m1 = k8.union(k8) m2 = m1.union(m1) m4 = m2.union(m2).repartition(4).cache() m4.count() 


рдирдИ рддреБрд▓рдирд╛ рдкрд╛рдпрдерди рдкрд░ рд╕реНрдХреИрд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЧрддрд┐ рд▓рд╛рдн рдХреЛ 7-8 рдЧреБрдирд╛ - 7 рд╕реЗрдХрдВрдб рдмрдирд╛рдо 55 рд╕реЗ рджрд░реНрд╢рд╛рддреА рд╣реИред рдЕрдВрдд рдореЗрдВ, рдЪрд▓реЛ "рд╕рдмрд╕реЗ рддреЗрдЬреА рд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ рд╣реИ" рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ - рд╕рд░рдгреА рдХреЗ рдпреЛрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ :


 import numpy numpy_sum = sqlContext.udf.register("numpy_sum", lambda x: float(numpy.sum(x)), DoubleType()) 

 val my_sum = sqlContext.udf.register("my_sum", (x: Seq[Int]) => x.map(_.toDouble).sum) 


рдлрд┐рд░ рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдордВрджреА - рд╕реНрдХрд╛рд▓рд╛ рдХреЗ 5 рд╕реЗрдХрдВрдб рдмрдирд╛рдо рдкрд╛рдЗрдерди рдХреЗ 80 рд╕реЗрдХрдВрдбред рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:


  • рдЬрдмрдХрд┐ PySpark рдорд╛рдирдХ API рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Scala рдХреА рдЧрддрд┐ рдореЗрдВ рддреБрд▓рдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдЬрдм рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реНрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ PySpark рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде, рдЬрдм рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рдХрдИ рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд╛рдпрдерди рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдЕрдкрд╢рд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЕрдЬрдЧрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди 5-10 рдзреАрдорд╛ рд╣реИред
  • рдпрджрд┐ C ++ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓ рд▓рд╛рдЧрдд рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдкрд╛рдпрдерди рдФрд░ рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ 10-50 рдЧреБрдирд╛ рддрдХ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЕрдЬрдЧрд░ рдХреЗ рд╕рднреА рдЖрдХрд░реНрд╖рдг рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдореЗрд╢рд╛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдкрд╛рдпрдерди рдУрд╡рд░рд╣реЗрдб рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣рд╛рдВ рд╕реНрдкрд╛рд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрджрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рд╕реНрдкрд╛рд░реНрдХ рдПрд╕рдХреНрдпреВрдПрд▓ рдПрдкреАрдЖрдИ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдкрд╛рдпрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?


рдпрджрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╣реИ рдФрд░ рдЕрдХреНрд╕рд░ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЬреЛ SQL API рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ PySpark рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдХрд╛рдлреА рдмрдврд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Odnoklassniki рдХреЗ рд▓рд┐рдП, рд╕реНрдкрд╛рд░реНрдХ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреВрдВрдЬреАрдЧрдд рд╡реНрдпрдп рдХреА рд▓рд╛рдЧрдд рдХрдИ рд▓рд╛рдЦ рд░реВрдмрд▓ рд╕реЗ рдмрдврд╝реЗрдЧреАред рдФрд░ рдЕрдЧрд░ рдЖрдк рдкрд╛рдпрдерди рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЙрдиреНрдирдд рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛рдиреА, рдзреАрдорд╛ рд╣реЛрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдХреЗрд╡рд▓ рд╕рдордп рдкрд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдкрд░рд┐рдорд╛рдг рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред


рд╡реЗрдХреНрдЯрд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рддреНрд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреВрдбреАрдПрдл рдЗрдирдкреБрдЯ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрдВрдбрд┐рдд рдбреЗрдЯрд╛рдлреНрд░реЗрдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдкреИрдХреЗрдЯред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ , рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдЕрдВрддрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ред


рдбреЗрдЯрд╛ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреА рдПрдХ рд╡реНрдпрд╛рдкрдХ рдЯреАрдо рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдоред рдпрд╛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕реНрдХрд╛рд▓рд╛ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдбреБрдмреЛ рджреЗрдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ: рдХрдИ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ , рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ PySpark рд╕реЗ рдкрд░реЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi443324/


All Articles