การจำแนกประเภทของผู้ให้บริการ Spark
จากมุมมองทั่วไปผู้ประกอบการ Spark สามารถแบ่งออกเป็นสองประเภทต่อไปนี้:
1) ผู้ดำเนินการแปลง/แปลงการแปลง: การแปลงนี้ไม่ได้กระตุ้นการส่งงานและเสร็จสิ้นการประมวลผลกระบวนการระดับกลางของงาน
การดำเนินการแปลงเป็นการคำนวณล่าช้าซึ่งหมายความว่าการดำเนินการแปลงเพื่อสร้าง RDD อื่นจากการแปลง RDD หนึ่งครั้งจะไม่ถูกดำเนินการทันที ต้องรอจนกว่าจะมีการดำเนินการก่อนที่จะมีการเรียกใช้งาน
2) ผู้ดำเนินการแอ็คชั่นแอ็คชั่น: ผู้ให้บริการประเภทนี้จะทริกเกอร์ SparkContext เพื่อส่งงาน
ผู้ดำเนินการแอ็คชั่นจะกระตุ้นงานการส่ง Spark (Job) และส่งออกข้อมูลไปยังระบบ Spark
จากมุมมองเล็ก ๆ ผู้ให้บริการ Spark สามารถแบ่งออกเป็นสามประเภทต่อไปนี้:
1) การแปลงตัวดำเนินการประเภทข้อมูลค่า การเปลี่ยนแปลงนี้ไม่ได้ทำให้เกิดการส่งงาน รายการข้อมูลที่ประมวลผลเป็นข้อมูลประเภทค่า
2) ตัวดำเนินการ transfromation ของประเภทข้อมูลคีย์-ค่า การเปลี่ยนแปลงนี้ไม่ได้ทำให้เกิดการส่งงาน รายการข้อมูลสำหรับการประมวลผลเป็นคู่ข้อมูลคีย์-ค่า
3) ผู้ดำเนินการแอ็คชั่นผู้ให้บริการประเภทนี้จะทริกเกอร์ SparkContext เพื่อส่งงาน
การแนะนำ
โดยปกติแล้วจะสะดวกกว่าในการเขียนโปรแกรม Spark ด้วย Scala หลังจากทั้งหมดรหัสต้นฉบับของ Spark เขียนใน Scala อย่างไรก็ตามมีนักพัฒนา Java จำนวนมากในปัจจุบันโดยเฉพาะอย่างยิ่งเมื่อการเชื่อมต่อข้อมูลและบริการออนไลน์ ในเวลานี้คุณต้องเชี่ยวชาญวิธีการบางอย่างในการใช้ Spark ใน Java
1. แผนที่
ไม่สามารถใช้แผนที่ได้บ่อยขึ้นเมื่อประมวลผลและแปลงข้อมูล
ก่อนที่จะใช้แผนที่คุณต้องกำหนดรูปแบบฟังก์ชันที่แปลงแล้วก่อน:
ฟังก์ชั่น <string, labeledpoint> transform = new function <string, labeledpoint> () {// string เป็นประเภทอินพุตของ labeledpoint บรรทัดที่แน่นอนคือประเภทเอาต์พุตที่แปลง @Override public labeledpoint การเรียก (แถวสตริง) โยนข้อยกเว้น {// rewrite เมธอดการโทร int rowsize = rowarr.length; double [] doublearr = new double [rowsize-1]; // ยกเว้นสำหรับ lable แรกส่วนที่เหลือของชิ้นส่วนจะถูกแยกวิเคราะห์เป็นสองเท่าและใส่ลงในอาร์เรย์สำหรับ (int i = 1; i <rowsize; i ++) {string out = rowarr [i]; doublearr [i] = double.parsedouble (แต่ละ); } // แปลงข้อมูลที่คุณเพิ่งได้รับเป็นเวกเตอร์คุณลักษณะเวกเตอร์ = เวกเตอร์. dense (doublearr); double label = double.parsedouble (Rowarr [0]); // สร้างรูปแบบข้อมูลสำหรับการจัดหมวดหมู่การฝึกอบรมฯ LABELEDPOINT POINT = NEW LABELEDPOINT (ฉลาก, คุณสมบัติ); จุดกลับ; -ควรให้ความสนใจเป็นพิเศษกับ:
1. อินพุตของวิธีการโทรควรเป็นประเภทของแถวข้อมูลก่อนการแปลง ค่าส่งคืนควรเป็นประเภทของแถวข้อมูลหลังจากการประมวลผล
2. หากมีการเรียกคลาสที่กำหนดเองในวิธีการแปลงโปรดทราบว่าชื่อคลาสจะต้องเป็นอนุกรมตัวอย่างเช่น
Public Class Treeensemble ใช้ serializable {}3. หากมีการเรียกวัตถุคลาสบางรายการในฟังก์ชันการแปลงเช่นวิธีการต้องเรียกพารามิเตอร์ภายนอกหรือรูปแบบการประมวลผลเชิงตัวเลข (มาตรฐานการทำให้เป็นมาตรฐาน ฯลฯ ) วัตถุจะต้องประกาศขั้นสุดท้าย
จากนั้นเรียกใช้ฟังก์ชันการแปลงตามความเหมาะสม
Javardd <LaxidEdPoint> rdd = oridata.tojavardd (). แผนที่ (แปลง);
วิธีนี้ต้องแปลง RDD ธรรมดาเป็น Javardd เพื่อใช้ การดำเนินการแปลงเป็น Javardd นั้นไม่ต้องใช้เวลานานดังนั้นไม่ต้องกังวล
2. กรอง
นอกจากนี้ยังใช้กันทั่วไปในสถานการณ์ต่าง ๆ เช่นการหลีกเลี่ยงค่า NULL DATA
ก่อนอื่นเราต้องกำหนดฟังก์ชั่น ผลที่แท้จริงของการส่งคืนค่าบูลีนที่ได้รับบรรทัดข้อมูลคือการเก็บข้อมูลที่ส่งคืนไปยัง TRUE
ฟังก์ชั่น <สตริง, บูลีน> boolfilter = ฟังก์ชั่นใหม่ <สตริง, บูลีน> () {// สตริงเป็นประเภทอินพุตของบรรทัดที่แน่นอน บูลีนเป็นประเภทเอาต์พุตที่สอดคล้องกัน ใช้เพื่อตรวจสอบว่าข้อมูลจะถูกเก็บไว้หรือไม่ @Override การเรียกบูลีนสาธารณะ (แถวสตริง) พ่นข้อยกเว้น {// เขียนวิธีการโทรไปที่ธงบูลีน = แถว! = null; ธงกลับ; -โดยปกติสิ่งที่ต้องแก้ไขในการใช้งานจริงของฟังก์ชั่นนี้เป็นเพียงประเภทของแถวนั่นคือประเภทอินพุตของแถวข้อมูล ซึ่งแตกต่างจากฟังก์ชั่นการแปลงข้างต้นค่าส่งคืนของวิธีการโทรนี้ควรได้รับการแก้ไขเป็นบูลีน
จากนั้นวิธีการโทร
Javardd <LaxidEdPoint> RDD = ORIDATA.TOJAVARDD (). ตัวกรอง (BOOLDILTER);
3. Maptopair
วิธีนี้ค่อนข้างคล้ายกับวิธีการแผนที่และยังทำการแปลงเป็นข้อมูลบางอย่าง อย่างไรก็ตามเอาต์พุตของฟังก์ชั่นนี้เป็นบรรทัดอินพุต tuple วิธีที่ใช้กันมากที่สุดคือการทำการตรวจสอบความถูกต้องข้ามหรือการคำนวณอัตราความผิดพลาดทางสถิติการคำนวณการเรียกคืน AUC ฯลฯ
ในทำนองเดียวกันคุณต้องกำหนดฟังก์ชันการแปลงก่อน
ฟังก์ชั่น <สตริง, บูลีน> transformer = new pairfunction <labeledPoint, Object, Object> () {// labeledPoint เป็นสองวัตถุหลังจากประเภทอินพุต อย่าเปลี่ยน @Override public tuple2 call (labeledpoint row) โยนข้อยกเว้น {// rewrite วิธีการโทรมักจะเปลี่ยนพารามิเตอร์อินพุตและเอาต์พุตเท่านั้น อย่าเปลี่ยน predicton สองครั้ง = thismodel.predict (row.features ()); สอง double label = row.label (); ส่งคืน Tuple2 ใหม่ (Predicton, Label); -เกี่ยวกับวัตถุคลาสการโทรและคลาสข้อกำหนดนั้นสอดคล้องกับวัตถุก่อนหน้านี้ คลาสจะต้องมีการจัดลำดับและวัตถุคลาสจะต้องประกาศเป็นประเภทสุดท้าย
การโทรที่เกี่ยวข้องมีดังนี้:
javapairrdd <วัตถุ, วัตถุ> การคาดการณ์ sandlabels = oridata.maptopair (หม้อแปลง);
จากนั้นสำหรับการใช้การคาดการณ์ sandlabels คำนวณความถูกต้องการเรียกคืนความแม่นยำและ AUC จะมีในบล็อกถัดไป โปรดติดตามความคืบหน้า
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com