рд╕рд░рд╛рд╡ рдордзреНрдпреЗ рд╕реНрдкрд╛рд░реНрдХ рдпреЛрдЬрдирд╛ рдЙрддреНрдХреНрд░рд╛рдВрддреА

рдкреНрд░рд┐рдп рд╡рд╛рдЪрдХрд╛рдВрдиреЛ, рд╢реБрдн рджрд┐рд╡рд╕!

рдпрд╛ рд▓реЗрдЦрд╛рдд, Neoflex рдЪреНрдпрд╛ рдмрд┐рдЧ рдбреЗрдЯрд╛ рд╕реЛрд▓реНрдпреБрд╢рдиреНрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреНрд╖реЗрддреНрд░рд╛рддреАрд▓ рдЖрдШрд╛рдбреАрдЪреЗ рд╕рд▓реНрд▓рд╛рдЧрд╛рд░ Apache Spark рд╡рд╛рдкрд░реВрди рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╢реЛрдХреЗрд╕ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рдВрдЪреЗ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдХрд░рддрд╛рдд.

рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рдХрд▓реНрдкрд╛рдЪрд╛ рдПрдХ рднрд╛рдЧ рдореНрд╣рдгреВрди, рдврд┐рд▓реЗ рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреЗ рдХрд╛рд░реНрдп рдЕрдиреЗрдХрджрд╛ рдЙрджреНрднрд╡рддреЗ.

рд╕рд╣рд╕рд╛ рд╣реЗ рд▓реЙрдЧ рдХрд┐рдВрд╡рд╛ рд╡рд┐рд╡рд┐рдз рд╕рд┐рд╕реНрдЯреАрдордордзреАрд▓ рдкреНрд░рддрд┐рд╕рд╛рдж рдЕрд╕рддрд╛рдд, рдЬреЗрдПрд╕рдУрдПрди рдХрд┐рдВрд╡рд╛ рдПрдХреНрд╕рдПрдордПрд▓ рдореНрд╣рдгреВрди рд╕реЗрд╡реНрд╣ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд. рдбреЗрдЯрд╛ Hadoop рд╡рд░ рдЕрдкрд▓реЛрдб рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рддреНрдпрд╛рдирдВрддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреВрди рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЖрдореНрд╣реА рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╢реЛрдХреЗрд╕рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдЖрдпреЛрдЬрд┐рдд рдХрд░реВ рд╢рдХрддреЛ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, Impala рджреНрд╡рд╛рд░реЗ.

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рд▓рдХреНрд╖реНрдп рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯрдЪреА рдпреЛрдЬрдирд╛ рдЖрдзреАрдкрд╛рд╕реВрди рдЬреНрдЮрд╛рдд рдирд╛рд╣реА. рд╢рд┐рд╡рд╛рдп, рдпреЛрдЬрдирд╛ рджреЗрдЦреАрд▓ рдЖрдЧрд╛рдК рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА, рдХрд╛рд░рдг рддреА рдбреЗрдЯрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ, рдЖрдгрд┐ рдЖрдореНрд╣реА рдпрд╛ рдЕрддрд┐рд╢рдп рдврд┐рд▓реЗ рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛рд╡рд░ рдХрд╛рдо рдХрд░рдд рдЖрд╣реЛрдд.

рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдЬ рдЦрд╛рд▓реАрд▓ рдкреНрд░рддрд┐рд╕рд╛рдж рд▓реЙрдЧ рдХреЗрд▓рд╛ рдЖрд╣реЗ:

{source: "app1", error_code: ""}

рдЖрдгрд┐ рдЙрджреНрдпрд╛ рддреНрдпрд╛рдЪ рдкреНрд░рдгрд╛рд▓реАрддреВрди рдкреБрдвреАрд▓ рдЙрддреНрддрд░ рдпреЗрдИрд▓:

{source: "app1", error_code: "error", description: "Network error"}

рдкрд░рд┐рдгрд╛рдореА, рд╢реЛрдХреЗрд╕рдордзреНрдпреЗ рдЖрдгрдЦреА рдПрдХ рдлреАрд▓реНрдб рдЬреЛрдбрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ - рд╡рд░реНрдгрди, рдЖрдгрд┐ рддреЗ рдпреЗрдИрд▓ рдХреА рдирд╛рд╣реА рд╣реЗ рдХреЛрдгрд╛рд▓рд╛рд╣реА рдорд╛рд╣рд┐рддреА рдирд╛рд╣реА.

рдЕрд╢рд╛ рдбреЗрдЯрд╛рд╡рд░ рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреЗ рдХрд╛рд░реНрдп рдЦреВрдкрдЪ рдорд╛рдирдХ рдЖрд╣реЗ рдЖрдгрд┐ рдпрд╛рд╕рд╛рдареА рд╕реНрдкрд╛рд░реНрдХрдХрдбреЗ рдЕрдиреЗрдХ рд╕рд╛рдзрдиреЗ рдЖрд╣реЗрдд. рд╕реНрддреНрд░реЛрдд рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, JSON рдЖрдгрд┐ XML рджреЛрдиреНрд╣реАрд╕рд╛рдареА рд╕рдорд░реНрдерди рдЖрд╣реЗ рдЖрдгрд┐ рдкреВрд░реНрд╡реА рдЕрдЬреНрдЮрд╛рдд рд╕реНрдХреАрдорд╛рд╕рд╛рдареА, рд╕реНрдХреАрдорд╛рдЗрд╡реНрд╣реЛрд▓реНрдпреВрд╢рдирд╕рд╛рдареА рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХреЗрд▓реЗ рдЖрд╣реЗ.

рдкрд╣рд┐рд▓реНрдпрд╛ рджреГрд╖реНрдЯреАрдХреНрд╖реЗрдкрд╛рдд, рдЙрдкрд╛рдп рд╕реЛрдкреЗ рджрд┐рд╕рддреЗ. рддреБрдореНрд╣рд╛рд▓рд╛ JSON рд╕рд╣ рдлреЛрд▓реНрдбрд░ рдШреНрдпрд╛рдпрдЪреЗ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдбреЗрдЯрд╛рдлреНрд░реЗрдордордзреНрдпреЗ рд╡рд╛рдЪрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдХреАрдорд╛ рддрдпрд╛рд░ рдХрд░реЗрд▓, рдиреЗрд╕реНрдЯреЗрдб рдбреЗрдЯрд╛рд▓рд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕рдордзреНрдпреЗ рдмрджрд▓реЗрд▓. рдкреБрдвреЗ, Hive рдореЗрдЯрд╛рд╕реНрдЯреЛрд░рдордзреНрдпреЗ рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯрдЪреА рдиреЛрдВрджрдгреА рдХрд░реВрди, рд╕рд░реНрд╡ рдХрд╛рд╣реА рдкрд░реНрдХреЗрдЯрдордзреНрдпреЗ рдЬрддрди рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЬреНрдпрд╛рд▓рд╛ рдЗрдореНрдкрд╛рд▓рд╛рдордзреНрдпреЗ рджреЗрдЦреАрд▓ рд╕рдорд░реНрдерди рдЖрд╣реЗ.

рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕реЛрдкреЗ рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рджрд┐рд╕рддреЗ.

рддрдерд╛рдкрд┐, рд╕рд░рд╛рд╡рд╛рддреАрд▓ рдЕрдиреЗрдХ рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдХрд╛рдп рдХрд░рд╛рд╡реЗ рд╣реЗ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рддреАрд▓ рд▓рд╣рд╛рди рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╡рд░реВрди рд╕реНрдкрд╖реНрдЯ рд╣реЛрдд рдирд╛рд╣реА.

рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдирд╛рд╣реА, рдкрд░рдВрддреБ рдбреЗрдЯрд╛рдлреНрд░реЗрдордордзреНрдпреЗ JSON рдХрд┐рдВрд╡рд╛ XML рд╡рд╛рдЪрдгреНрдпрд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ.

рдмрд╣реБрджрд╛, рддреЗ JSON рдХрд╕реЗ рд╡рд╛рдЪрд╛рдпрдЪреЗ рдЖрдгрд┐ рдкрд╛рд░реНрд╕ рдХрд░рд╛рдпрдЪреЗ рддреЗ рджрд╛рдЦрд╡рддреЗ:

df = spark.read.json(path...)

рд╕реНрдкрд╛рд░реНрдХрд▓рд╛ рдбреЗрдЯрд╛ рдЙрдкрд▓рдмреНрдз рдХрд░реВрди рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ.

рд╕рд░рд╛рд╡ рдордзреНрдпреЗ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрдХреНрдд рдлреЛрд▓реНрдбрд░рдордзреВрди JSON рдлрд╛рдпрд▓реА рд╡рд╛рдЪрдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЖрдгрд┐ рдбреЗрдЯрд╛рдлреНрд░реЗрдо рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЦреВрдкрдЪ рдХреНрд▓рд┐рд╖реНрдЯ рдЖрд╣реЗ. рдкрд░рд┐рд╕реНрдерд┐рддреА рдЕрд╢реА рджрд┐рд╕рддреЗ: рдЖрдзреАрдЪ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯ рдЖрд╣реЗ, рджрд░рд░реЛрдЬ рдирд╡реАрди рдбреЗрдЯрд╛ рдпреЗрддреЛ, рддреНрдпрд╛рдВрдирд╛ рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯрдордзреНрдпреЗ рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рд╣реЗ рд╡рд┐рд╕рд░реВ рдирдХрд╛ рдХреА рдпреЛрдЬрдирд╛ рднрд┐рдиреНрди рдЕрд╕реВ рд╢рдХрддреЗ.

рд╢реЛрдХреЗрд╕ рдмрд╛рдВрдзрдгреНрдпрд╛рдЪреА рдиреЗрд╣рдореАрдЪреА рдпреЛрдЬрдирд╛ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЖрд╣реЗ:

рдЪрд░рдг 1. рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рджреИрдирд┐рдХ рд░реАрд▓реЛрдбрд┐рдВрдЧрд╕рд╣ рдбреЗрдЯрд╛ Hadoop рдордзреНрдпреЗ рд▓реЛрдб рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдирд╡реАрди рд╡рд┐рднрд╛рдЬрдирд╛рдордзреНрдпреЗ рдЬреЛрдбрд▓рд╛ рдЬрд╛рддреЛ. рджрд┐рд╡рд╕рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛рд╕рд╣ рдПрдХ рдлреЛрд▓реНрдбрд░ рдмрд╛рд╣реЗрд░ рд╡рд│рддреЗ.

рдЪрд░рдг 2. рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдб рджрд░рдореНрдпрд╛рди, рд╣реЗ рдлреЛрд▓реНрдбрд░ рд╕реНрдкрд╛рд░реНрдХрджреНрд╡рд╛рд░реЗ рд╡рд╛рдЪрд▓реЗ рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛рдлреНрд░реЗрдо рдкрд╛рд░реНрд╕реЗрдмрд▓ рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд╕реЗрд╡реНрд╣ рдХреЗрд▓реА рдЬрд╛рддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдкрд░реНрдХреЗрдЯрдордзреНрдпреЗ, рдЬреА рдирдВрддрд░ рдЗрдореНрдкрд╛рд▓рд╛рдордзреНрдпреЗ рдЖрдпрд╛рдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ. рд╣реЗ рдпрд╛ рдмрд┐рдВрджреВрдкрд░реНрдпрдВрдд рдЬрдорд╛ рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдбреЗрдЯрд╛рд╕рд╣ рд▓рдХреНрд╖реНрдп рд╢реЛрдХреЗрд╕ рддрдпрд╛рд░ рдХрд░рддреЗ.

рдЪрд░рдг 3. рдПрдХ рдбрд╛рдЙрдирд▓реЛрдб рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрд╣реЗ рдЬреЗ рджрд░рд░реЛрдЬ рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯ рдЕрджреНрдпрддрдирд┐рдд рдХрд░реЗрд▓.
рд╡рд╛рдвреАрд╡ рд▓реЛрдбрд┐рдВрдЧрдЪрд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ, рд╢реЛрдХреЗрд╕рдЪреЗ рд╡рд┐рднрд╛рдЬрди рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдЖрдгрд┐ рд╢реЛрдХреЗрд╕рдЪреА рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рд░рд╛рдЦрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ.

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдШреЗрдК. рд╕рдордЬрд╛ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╡рдгреНрдпрд╛рдЪреА рдкрд╣рд┐рд▓реА рдкрд╛рдпрд░реА рд▓рд╛рдЧреВ рдХреЗрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ рдЖрдгрд┐ JSON рдлрд╛рдЗрд▓реНрд╕ рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рдЕрдкрд▓реЛрдб рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд.

рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреВрди рдбреЗрдЯрд╛рдлреНрд░реЗрдо рддрдпрд╛рд░ рдХрд░рдгреЗ, рдирдВрддрд░ рддреЗ рд╢реЛрдХреЗрд╕ рдореНрд╣рдгреВрди рдЬрддрди рдХрд░рдгреЗ, рд╣реА рд╕рдорд╕реНрдпрд╛ рдирд╛рд╣реА. рд╣реА рдкрд╣рд┐рд▓реА рдкрд╛рдпрд░реА рдЖрд╣реЗ рдЬреА рд╕реНрдкрд╛рд░реНрдХ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдд рд╕рд╣рдЬрдкрдгреЗ рдЖрдврд│реВ рд╢рдХрддреЗ:

df = spark.read.option("mergeSchema", True).json(".../*") 
df.printSchema()

root 
|-- a: long (nullable = true) 
|-- b: string (nullable = true) 
|-- c: struct (nullable = true) |    
|-- d: long (nullable = true)

рд╕рд░реНрд╡ рдХрд╛рд╣реА рдареАрдХ рдЖрд╣реЗ рдЕрд╕реЗ рджрд┐рд╕рддреЗ.

рдЖрдореНрд╣реА JSON рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдд рдХрд░рддреЛ, рддреНрдпрд╛рдирдВрддрд░ рдЖрдореНрд╣реА рдбреЗрдЯрд╛рдлреНрд░реЗрдорд▓рд╛ рдкрд░реНрдХреЗрдЯ рдореНрд╣рдгреВрди рд╕реЗрд╡реНрд╣ рдХрд░рддреЛ, рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реЛрдпреАрд╕реНрдХрд░ рдкрджреНрдзрддреАрдиреЗ Hive рдордзреНрдпреЗ рдиреЛрдВрджрдгреА рдХрд░рддреЛ:

df.write.format(тАЬparquetтАЭ).option('path','<External Table Path>').saveAsTable('<Table Name>')

рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдЦрд┐рдбрдХреА рдорд┐рд│рддреЗ.

рдкрд░рдВрддреБ, рджреБрд╕рд▒реНрдпрд╛ рджрд┐рд╡рд╢реА, рд╕реНрддреНрд░реЛрддрд╛рдХрдбреВрди рдирд╡реАрди рдбреЗрдЯрд╛ рдЬреЛрдбрд▓рд╛ рдЧреЗрд▓рд╛. рдЖрдордЪреНрдпрд╛рдХрдбреЗ JSON рд╕рд╣ рдлреЛрд▓реНрдбрд░ рдЖрд╣реЗ рдЖрдгрд┐ рдпрд╛ рдлреЛрд▓реНрдбрд░рдордзреВрди рд╢реЛрдХреЗрд╕ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрд╣реЗ. рд╕реНрддреНрд░реЛрддрд╛рдХрдбреВрди рдбреЗрдЯрд╛рдЪреА рдкреБрдвреАрд▓ рдмреЕрдЪ рд▓реЛрдб рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдбреЗрдЯрд╛ рдорд╛рд░реНрдЯрдордзреНрдпреЗ рдПрдХ рджрд┐рд╡рд╕рд╛рдЪрд╛ рдбреЗрдЯрд╛ рдЧрд╣рд╛рд│ рдЖрд╣реЗ.

рддрд╛рд░реНрдХрд┐рдХ рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯрдЪреЗ рджрд┐рд╡рд╕реЗрдВрджрд┐рд╡рд╕ рд╡рд┐рднрд╛рдЬрди рдХрд░рдгреЗ, рдЬреЗ рдкреНрд░рддреНрдпреЗрдХ рджреБрд╕рд▒реНрдпрд╛ рджрд┐рд╡рд╢реА рдирд╡реАрди рд╡рд┐рднрд╛рдЬрди рдЬреЛрдбрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрд▓. рдпрд╛рд╕рд╛рдареАрдЪреА рдпрдВрддреНрд░рдгрд╛ рджреЗрдЦреАрд▓ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рдЖрд╣реЗ, рд╕реНрдкрд╛рд░реНрдХ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рднрд╛рдЬрдиреЗ рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рд▓рд┐рд╣реВ рджреЗрддреЗ.

рдкреНрд░рдердо, рдЖрдореНрд╣реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдб рдХрд░рддреЛ, рд╡рд░ рд╡рд░реНрдгрди рдХреЗрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ рдбреЗрдЯрд╛ рдЬрддрди рдХрд░рддреЛ, рдлрдХреНрдд рд╡рд┐рднрд╛рдЬрди рдЬреЛрдбрддреЛ. рдпрд╛ рдХреНрд░рд┐рдпреЗрд▓рд╛ рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯ рдЗрдирд┐рд╢рд┐рдПрд▓рд╛рдпрдЭреЗрд╢рди рдореНрд╣рдгрддрд╛рдд рдЖрдгрд┐ рдлрдХреНрдд рдПрдХрджрд╛рдЪ рдХреЗрд▓реЗ рдЬрд╛рддреЗ:

df.write.partitionBy("date_load").mode("overwrite").parquet(dbpath + "/" + db + "/" + destTable)

рджреБрд╕рд▒реНрдпрд╛ рджрд┐рд╡рд╢реА, рдЖрдореНрд╣реА рдлрдХреНрдд рдПрдХ рдирд╡реАрди рд╡рд┐рднрд╛рдЬрди рд▓реЛрдб рдХрд░рддреЛ:

df.coalesce(1).write.mode("overwrite").parquet(dbpath + "/" + db + "/" + destTable +"/date_load=" + date_load + "/")

рд╕реНрдХреАрдорд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА Hive рдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рдиреЛрдВрджрдгреА рдХрд░рдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ.
рдорд╛рддреНрд░, рдЗрдереЗрдЪ рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛рдд.

рдкрд╣рд┐рд▓реА рд╕рдорд╕реНрдпрд╛. рд▓рд╡рдХрд░рдЪ рдХрд┐рдВрд╡рд╛ рдирдВрддрд░, рдкрд░рд┐рдгрд╛рдореА рдкрд╛рд░реНрдХреЗрдЯ рдЕрд╡рд╛рдЪрдиреАрдп рдЕрд╕реЗрд▓. рд╣реЗ рдкрд╛рд░реНрдХреЗрдЯ рдЖрдгрд┐ JSON рд░рд┐рдХрд╛рдореНрдпрд╛ рдлреАрд▓реНрдбрд▓рд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рдХрд╕реЗ рд╡рд╛рдЧрд╡рддрд╛рдд рдпрд╛рдореБрд│реЗ рдЖрд╣реЗ.

рдЪрд▓рд╛ рдПрдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХрд╛рд▓ JSON рдЖрд▓рд╛:

╨Ф╨╡╨╜╤М 1: {"a": {"b": 1}},

рдЖрдгрд┐ рдЖрдЬ рддреЗрдЪ JSON рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

╨Ф╨╡╨╜╤М 2: {"a": null}

рд╕рдордЬрд╛ рдЖрдкрд▓реНрдпрд╛рдХрдбреЗ рджреЛрди рднрд┐рдиреНрди рд╡рд┐рднрд╛рдЬрдиреЗ рдЖрд╣реЗрдд, рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреА рдПрдХ рдУрд│ рдЖрд╣реЗ.
рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рд╕рдВрдкреВрд░реНрдг рд╕реНрддреНрд░реЛрдд рдбреЗрдЯрд╛ рд╡рд╛рдЪрддреЛ, рддреЗрд╡реНрд╣рд╛ рд╕реНрдкрд╛рд░реНрдХ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рдд рд╕рдХреНрд╖рдо рд╣реЛрдИрд▓ рдЖрдгрд┐ "a" рд╣реЗ "рд╕рдВрд░рдЪрдирд╛" рдкреНрд░рдХрд╛рд░рдЪреЗ рдлреАрд▓реНрдб рдЖрд╣реЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ INT рдкреНрд░рдХрд╛рд░рд╛рддреАрд▓ "b" рдиреЗрд╕реНрдЯреЗрдб рдлреАрд▓реНрдб рдЖрд╣реЗ рд╣реЗ рд╕рдордЬреЗрд▓. рдкрд░рдВрддреБ, рдЬрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рднрд╛рдЬрди рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдЬрддрди рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЕрд╕реЗрд▓, рддрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рд╕рдВрдЧрдд рд╡рд┐рднрд╛рдЬрди рдпреЛрдЬрдирд╛рдВрд╕рд╣ рдПрдХ рдкрд╛рд░реНрдХреЗрдЯ рдорд┐рд│реЗрд▓:

df1 (a: <struct<"b": INT>>)
df2 (a: STRING NULLABLE)

рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреА рд╕рд░реНрд╡рдЬреНрдЮрд╛рдд рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдПрдХ рдкрд░реНрдпрд╛рдп рд╡рд┐рд╢реЗрд╖ рдЬреЛрдбрд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ - рд╕реНрддреНрд░реЛрдд рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛рдирд╛, рд░рд┐рдХреНрдд рдлреАрд▓реНрдб рдХрд╛рдврд╛:

df = spark.read.json("...", dropFieldIfAllNull=True)

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдкрд╛рд░реНрдХреЗрдЯрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЬрдиреЗ рдЕрд╕рддреАрд▓ рдЬреА рдПрдХрддреНрд░ рд╡рд╛рдЪрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд.
рдЬреНрдпрд╛рдВрдиреА рд╣реЗ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдд рдХреЗрд▓реЗ рдЖрд╣реЗ рддреЗ рдпреЗрдереЗ рдХрдбрд╡рдЯрдкрдгреЗ рд╣рд╕рддреАрд▓. рдХрд╛? рд╣реЛрдп, рдХрд╛рд░рдг рдЖрдгрдЦреА рджреЛрди рдкрд░рд┐рд╕реНрдерд┐рддреА рдЕрд╕рдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдЖрд╣реЗ. рдХрд┐рдВрд╡рд╛ рддреАрди. рдХрд┐рдВрд╡рд╛ рдЪрд╛рд░. рдкреНрд░рдердо, рдЬреЗ рдЬрд╡рд│рдЬрд╡рд│ рдирд┐рд╢реНрдЪрд┐рддрдкрдгреЗ рдШрдбреЗрд▓, рддреЗ рдореНрд╣рдгрдЬреЗ рднрд┐рдиреНрди JSON рдлрд╛рдпрд▓реАрдВрдордзреНрдпреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рднрд┐рдиреНрди рджрд┐рд╕рддреАрд▓. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, {intField: 1} рдЖрдгрд┐ {intField: 1.1}. рдЬрд░ рдЕрд╢реА рдлреАрд▓реНрдб рдПрдХрд╛ рд╡рд┐рднрд╛рдЬрдирд╛рдд рдЖрдврд│рд▓реА, рддрд░ рд╕реНрдХреАрдорд╛ рдорд░реНрдЬ рд╕рд░реНрд╡рдХрд╛рд╣реА рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рд╡рд╛рдЪреЗрд▓, рдЬреНрдпрд╛рдореБрд│реЗ рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рдкреНрд░рдХрд╛рд░ рдорд┐рд│реЗрд▓. рдкрд░рдВрддреБ рдЬрд░ рднрд┐рдиреНрди рдЕрд╕рддреАрд▓ рддрд░, рдПрдХрд╛рдХрдбреЗ intField: int рдЕрд╕реЗрд▓ рдЖрдгрд┐ рджреБрд╕рд░реНтАНрдпрд╛рдХрдбреЗ intField: рджреБрд╣реЗрд░реА рдЕрд╕реЗрд▓.

рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреА рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА рдЦрд╛рд▓реАрд▓ рдзреНрд╡рдЬ рдЖрд╣реЗ:

df = spark.read.json("...", dropFieldIfAllNull=True, primitivesAsString=True)

рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдлреЛрд▓реНрдбрд░ рдЖрд╣реЗ рдЬрд┐рдереЗ рд╡рд┐рднрд╛рдЬрдиреЗ рдЖрд╣реЗрдд рдЬреА рдПрдХрд╛рдЪ рдбреЗрдЯрд╛рдлреНрд░реЗрдордордзреНрдпреЗ рд╡рд╛рдЪрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд рдЖрдгрд┐ рд╕рдВрдкреВрд░реНрдг рд╢реЛрдХреЗрд╕рдЪреА рд╡реИрдз рдкрд╛рд░реНрдХреЗрдЯ рдЖрд╣реЗ. рд╣реЛрдп? рдирд╛рд╣реА.

рдЖрдореНрд╣реА рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ рдХреА рдЖрдореНрд╣реА рдкреЛрд│реНрдпрд╛рдордзреНрдпреЗ рдЯреЗрдмрд▓рдЪреА рдиреЛрдВрджрдгреА рдХреЗрд▓реА рдЖрд╣реЗ. рдлреАрд▓реНрдб рдирд╛рд╡рд╛рдВрдордзреНрдпреЗ рдкреЛрд│реЗ рдХреЗрд╕ рд╕реЗрдиреНрд╕реЗрдЯрд┐рд╡реНрд╣ рдирд╕рддрд╛рдд, рддрд░ рдкрд░реНрдХреЗрдЯ рдХреЗрд╕ рд╕реЗрдиреНрд╕реЗрдЯрд┐рд╡реНрд╣ рдЕрд╕рддреЗ. рдореНрд╣рдгреВрди, рд╕реНрдХреАрдорд╛рд╕рд╣ рд╡рд┐рднрд╛рдЬрдиреЗ: field1: int, рдЖрдгрд┐ Field1: int рд╣реЗ Hive рд╕рд╛рдареА рд╕рдорд╛рди рдЖрд╣реЗрдд, рдкрд░рдВрддреБ Spark рд╕рд╛рдареА рдирд╛рд╣реАрдд. рдлреАрд▓реНрдбрдЪреА рдирд╛рд╡реЗ рд▓реЛрдЕрд░рдХреЗрд╕рдордзреНрдпреЗ рдмрджрд▓рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛.

рддреНрдпрд╛рдирдВрддрд░, рд╕рд░реНрд╡рдХрд╛рд╣реА рдареАрдХ рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рджрд┐рд╕рддреЗ.

рддрдерд╛рдкрд┐, рд╕рд░реНрд╡ рдЗрддрдХреЗ рд╕реЛрдкреЗ рдирд╛рд╣реА. рджреБрд╕рд░реА, рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ. рдкреНрд░рддреНрдпреЗрдХ рдирд╡реАрди рд╡рд┐рднрд╛рдЬрди рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рд╕реЗрд╡реНрд╣ рдХреЗрд▓реНрдпрд╛рдореБрд│реЗ, рд╡рд┐рднрд╛рдЬрди рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рд╕реНрдкрд╛рд░реНрдХ рд╕реЗрд╡рд╛ рдлрд╛рдЗрд▓реНрд╕ рдЕрд╕рддреАрд▓, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, _SUCCESS рдСрдкрд░реЗрд╢рди рд╕рдХреНрд╕реЗрд╕ рдлреНрд▓реЕрдЧ. рдпрд╛рдореБрд│реЗ рдкрд░реНрдХреЗрдЯ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддрд╛рдирд╛ рддреНрд░реБрдЯреА рдпреЗрдИрд▓. рд╣реЗ рдЯрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА, рд╕реНрдкрд╛рд░реНрдХрд▓рд╛ рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рд╕реЗрд╡рд╛ рдлрд╛рдЗрд▓реНрд╕ рдЬреЛрдбрдгреНрдпрд╛рдкрд╛рд╕реВрди рд░реЛрдЦрдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

hadoopConf = sc._jsc.hadoopConfiguration()
hadoopConf.set("parquet.enable.summary-metadata", "false")
hadoopConf.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false")

рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА рдЖрддрд╛ рджрд░рд░реЛрдЬ рдПрдХ рдирд╡реАрди рдкрд░реНрдХреЗрдЯ рд╡рд┐рднрд╛рдЬрди рд▓рдХреНрд╖реНрдп рд╢реЛрдХреЗрд╕ рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рдЬреЛрдбрд▓реЗ рдЬрд╛рддреЗ, рдЬреЗрдереЗ рджрд┐рд╡рд╕рд╛рд╕рд╛рдареА рдкрд╛рд░реНрд╕ рдХреЗрд▓реЗрд▓рд╛ рдбреЗрдЯрд╛ рд╕реНрдерд┐рдд рдЖрд╣реЗ. рдЖрдореНтАНрд╣реА рдЖрдзреАрдЪ рдХрд╛рд│рдЬреА рдШреЗрддрд▓реА рд╣реЛрддреА рдХреА рдбреЗрдЯрд╛ рдЯрд╛рдИрдк рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдЕрд╕рд▓реЗрд▓реЗ рдХреЛрдгрддреЗрд╣реА рд╡рд┐рднрд╛рдЬрди рдирд╛рд╣реАрдд.

рдкрдг, рдЖрдордЪреА рддрд┐рд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ. рдЖрддрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХреАрдорд╛ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА, рд╢рд┐рд╡рд╛рдп, Hive рдордзреАрд▓ рдЯреЗрдмрд▓рдордзреНрдпреЗ рдЪреБрдХреАрдЪреА рд╕реНрдХреАрдорд╛ рдЖрд╣реЗ, рдХрд╛рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдирд╡реАрди рд╡рд┐рднрд╛рдЬрдирд╛рдиреЗ рдмрд╣реБрдзрд╛ рд╕реНрдХреАрдорд╛рдордзреНрдпреЗ рд╡рд┐рдХреГрддреА рдЖрдгрд▓реА рдЖрд╣реЗ.

рддреБрдореНрд╣рд╛рд▓рд╛ рдЯреЗрдмрд▓рдЪреА рдкреБрдиреНрд╣рд╛ рдиреЛрдВрджрдгреА рдХрд░рд╛рд╡реА рд▓рд╛рдЧреЗрд▓. рд╣реЗ рдЕрдЧрджреА рд╕реЛрдкреНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рдХрд░рддрд╛ рдпреЗрддреЗ: рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯрдЪреЗ рдкрд╛рд░реНрдХреЗрдЯ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдЪрд╛, рд╕реНрдХреАрдорд╛ рдШреНрдпрд╛ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд DDL рддрдпрд╛рд░ рдХрд░рд╛, рдЬреНрдпрд╛рджреНрд╡рд╛рд░реЗ Hive рдордзреАрд▓ рдлреЛрд▓реНрдбрд░рдЪреА рдмрд╛рд╣реНрдп рд╕рд╛рд░рдгреА рдореНрд╣рдгреВрди рдкреБрдиреНрд╣рд╛ рдиреЛрдВрджрдгреА рдХрд░рд╛, рд▓рдХреНрд╖реНрдп рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯрдЪреА рд╕реНрдХреАрдорд╛ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рд╛.

рдЖрдордЪреА рдЪреМрдереА рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ. рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛ рдЯреЗрдмрд▓рдЪреА рдиреЛрдВрджрдгреА рдХреЗрд▓реА рддреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рд╕реНрдкрд╛рд░реНрдХрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рд╣реЛрддреЛ. рдЖрддрд╛ рдЖрдореНрд╣реА рддреЗ рд╕реНрд╡рддрдГ рдХрд░рддреЛ рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдЖрд╣реЗ рдХреА рдкреЛрд│реНрдпрд╛рд╕рд╛рдареА рдкрд░рд╡рд╛рдирдЧреА рдирд╕рд▓реЗрд▓реНрдпрд╛ рд╡рд░реНрдгрд╛рдВрд╕рд╣ рдкреЛрд░реНрдХреЗрдЯ рдлреАрд▓реНрдб рд╕реБрд░реВ рд╣реЛрдК рд╢рдХрддрд╛рдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕реНрдкрд╛рд░реНрдХ "рднреНрд░рд╖реНрдЯ_рд░реЗрдХреЙрд░реНрдб" рдлреАрд▓реНрдбрдордзреНтАНрдпреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдд рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА рдЕрд╢рд╛ рдУрд│реА рдмрд╛рд╣реЗрд░ рдЯрд╛рдХрддреЛ. рдирд┐рд╕рдЯрд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдЕрд╢рд╛ рдлреАрд▓реНрдбрдЪреА рдкреЛрд│реНрдпрд╛рдордзреНрдпреЗ рдиреЛрдВрджрдгреА рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА.

рд╣реЗ рдЬрд╛рдгреВрди рдШреЗрддрд▓реНрдпрд╛рд╡рд░, рдЖрдореНрд╣рд╛рд▓рд╛ рдпреЛрдЬрдирд╛ рдорд┐рд│рддреЗ:

f_def = ""
for f in pf.dtypes:
  if f[0] != "date_load":
    f_def = f_def + "," + f[0].replace("_corrupt_record", "`_corrupt_record`") + " " + f[1].replace(":", "`:").replace("<", "<`").replace(",", ",`").replace("array<`", "array<") 
table_define = "CREATE EXTERNAL TABLE jsonevolvtable (" + f_def[1:] + " ) "
table_define = table_define + "PARTITIONED BY (date_load string) STORED AS PARQUET LOCATION '/user/admin/testJson/testSchemaEvolution/pq/'"
hc.sql("drop table if exists jsonevolvtable")
hc.sql(table_define)

рдХреЛрдб ("_corrupt_record", "`_corrupt_record`") + " " + f[1].replace(":", "`:").replace("<", "<`").replace(",", ",`").рдмрджрд▓рд╛("рдЕреЕрд░реЗ<`", "рдЕреЕрд░реЗ<") рд╕реБрд░рдХреНрд╖рд┐рдд DDL рдмрдирд╡рддреЗ, рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛рдРрд╡рдЬреА:

create table tname (_field1 string, 1field string)

"_field1, 1field" рд╕рд╛рд░рдЦреНрдпрд╛ рдлреАрд▓реНрдб рдирд╛рд╡рд╛рдВрд╕рд╣ рд╕реБрд░рдХреНрд╖рд┐рдд DDL рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ рдЬреЗрдереЗ рдлреАрд▓реНрдбрдЪреА рдирд╛рд╡реЗ рдПрд╕реНрдХреЗрдк рдХреЗрд▓реА рдЬрд╛рддрд╛рдд: рдЯреЗрдмрд▓ `tname` (`_field1` рд╕реНрдЯреНрд░рд┐рдВрдЧ, `1field` рд╕реНрдЯреНрд░рд┐рдВрдЧ) рддрдпрд╛рд░ рдХрд░рд╛.

рдкреНрд░рд╢реНрди рдЙрджреНрднрд╡рддреЛ: рд╕рдВрдкреВрд░реНрдг рд╕реНрдХреАрдорд╛ (рдкреАрдПрдл рдХреЛрдбрдордзреНрдпреЗ) рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдбреЗрдЯрд╛рдлреНрд░реЗрдо рдХрд╢реА рдорд┐рд│рд╡рд╛рдпрдЪреА? рд╣рд╛ рдкреАрдПрдл рдХрд╕рд╛ рдорд┐рд│рд╡рд╛рдпрдЪрд╛? рд╣реА рдкрд╛рдЪрд╡реА рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ. рд▓рдХреНрд╖реНрдп рд╢реЛрдХреЗрд╕рдЪреНрдпрд╛ рдкрд╛рд░реНрдХреЗрдЯ рдлрд╛рдЗрд▓реНрд╕рд╕рд╣ рдлреЛрд▓реНрдбрд░рдордзреАрд▓ рд╕рд░реНрд╡ рд╡рд┐рднрд╛рдЬрдирд╛рдВрдЪреА рдпреЛрдЬрдирд╛ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдЪрд╛рдпрдЪреА? рд╣реА рдкрджреНрдзрдд рд╕рд░реНрд╡рд╛рдд рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗ, рдкрд░рдВрддреБ рдХрдареАрдг рдЖрд╣реЗ.

рд╕реНрдХреАрдорд╛ рдЖрдзреАрдЪ Hive рдордзреНрдпреЗ рдЖрд╣реЗ. рд╕рдВрдкреВрд░реНрдг рдЯреЗрдмрд▓рдЪрд╛ рд╕реНрдХреАрдорд╛ рдЖрдгрд┐ рдирд╡реАрди рд╡рд┐рднрд╛рдЬрди рдПрдХрддреНрд░ рдХрд░реВрди рддреБрдореНрд╣реА рдирд╡реАрди рд╕реНрдХреАрдорд╛ рдорд┐рд│рд╡реВ рд╢рдХрддрд╛. рдореНрд╣рдгреВрди рддреБрдореНрд╣рд╛рд▓рд╛ Hive рд╡рд░реВрди рдЯреЗрдмрд▓ рд╕реНрдХреАрдорд╛ рдШреНрдпрд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ рдирд╡реАрди рд╡рд┐рднрд╛рдЬрдирд╛рдЪреНрдпрд╛ рд╕реНрдХреАрдорд╛рд╕рд╣ рдПрдХрддреНрд░ рдХрд░рд╛. рд╣реЗ Hive рдордзреАрд▓ рдЪрд╛рдЪрдгреА рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╡рд╛рдЪреВрди, рддрд╛рддреНрдкреБрд░рддреНрдпрд╛ рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рд╕реЗрд╡реНрд╣ рдХрд░реВрди рдЖрдгрд┐ рдПрдХрд╛рдЪ рд╡реЗрд│реА рджреЛрдиреНрд╣реА рд╡рд┐рднрд╛рдЬрдиреЗ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрдкрд╛рд░реНрдХ рд╡рд╛рдкрд░реВрди рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.

рдЦрд░рдВ рддрд░, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рдЖрд╣реЗ: Hive рдордзреАрд▓ рдореВрд│ рдЯреЗрдмрд▓ рд╕реНрдХреАрдорд╛ рдЖрдгрд┐ рдирд╡реАрди рд╡рд┐рднрд╛рдЬрди. рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдбреЗрдЯрд╛ рджреЗрдЦреАрд▓ рдЖрд╣реЗ. рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯ рд╕реНрдХреАрдорд╛ рдЖрдгрд┐ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд┐рднрд╛рдЬрдирд╛рдордзреВрди рдирд╡реАрди рдлреАрд▓реНрдб рдПрдХрддреНрд░рд┐рдд рдХрд░рдгрд╛рд░реА рдирд╡реАрди рд╕реНрдХреАрдорд╛ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдлрдХреНрдд рд░рд╛рд╣рддреЗ:

from pyspark.sql import HiveContext
from pyspark.sql.functions import lit
hc = HiveContext(spark)
df = spark.read.json("...", dropFieldIfAllNull=True)
df.write.mode("overwrite").parquet(".../date_load=12-12-2019")
pe = hc.sql("select * from jsonevolvtable limit 1")
pe.write.mode("overwrite").parquet(".../fakePartiton/")
pf = spark.read.option("mergeSchema", True).parquet(".../date_load=12-12-2019/*", ".../fakePartiton/*")

рдкреБрдвреЗ, рдорд╛рдЧреАрд▓ рд╕реНрдирд┐рдкреЗрдЯ рдкреНрд░рдорд╛рдгреЗ рдЖрдореНрд╣реА рдЯреЗрдмрд▓ рдиреЛрдВрджрдгреА DDL рддрдпрд╛рд░ рдХрд░рддреЛ.
рдЬрд░ рд╕рдВрдкреВрд░реНрдг рд╢реГрдВрдЦрд▓рд╛ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд░рдд рдЕрд╕реЗрд▓, рдореНрд╣рдгрдЬреЗ, рдЖрд░рдВрднрд┐рдХ рд▓реЛрдб рд╣реЛрддрд╛ рдЖрдгрд┐ Hive рдордзреНрдпреЗ рдЯреЗрдмрд▓ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЕрд╕реЗрд▓, рддрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдЕрджреНрдпрддрдирд┐рдд рдЯреЗрдмрд▓ рд╕реНрдХреАрдорд╛ рдорд┐рд│реЗрд▓.

рдЖрдгрд┐ рд╢реЗрд╡рдЯрдЪреА рдЕрдбрдЪрдг рдЕрд╢реА рдЖрд╣реЗ рдХреА рддреБрдореНрд╣реА рдлрдХреНрдд рд╣рд╛рдпрд╡реНрд╣ рдЯреЗрдмрд▓рдордзреНрдпреЗ рд╡рд┐рднрд╛рдЬрди рдЬреЛрдбреВ рд╢рдХрдд рдирд╛рд╣реА, рдХрд╛рд░рдг рддреЗ рддреБрдЯрд▓реЗ рдЬрд╛рдИрд▓. рд╡рд┐рднрд╛рдЬрди рд░рдЪрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ Hive рд▓рд╛ рд╕рдХреНрддреА рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

from pyspark.sql import HiveContext
hc = HiveContext(spark) 
hc.sql("MSCK REPAIR TABLE " + db + "." + destTable)

JSON рд╡рд╛рдЪрдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд╕реНрдЯреЛрдЕрд░рдлреНрд░рдВрдЯ рддрдпрд╛рд░ рдХрд░рдгреЗ рдпрд╛ рд╕реЛрдкреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рдЪрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдиреЗрдХ рдЕрд╡реНрдпрдХреНрдд рдЕрдбрдЪрдгреАрдВрд╡рд░ рдорд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЛрддреЛ, рдЬреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рд╢реЛрдзрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд. рдЖрдгрд┐ рдЬрд░реА рд╣реЗ рдЙрдкрд╛рдп рд╕реЛрдкреЗ рдЕрд╕рд▓реЗ рддрд░реА рддреЗ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рдЦреВрдк рд╡реЗрд│ рд▓рд╛рдЧрддреЛ.

рд╢реЛрдХреЗрд╕рдЪреНрдпрд╛ рдмрд╛рдВрдзрдХрд╛рдорд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдорд▓рд╛ рд╣реЗ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ:

  • рд╢реЛрдХреЗрд╕рдордзреНрдпреЗ рд╡рд┐рднрд╛рдЬрдиреЗ рдЬреЛрдбрд╛, рд╕реЗрд╡рд╛ рдлрд╛рдЗрд▓реНрд╕рдкрд╛рд╕реВрди рдореБрдХреНрдд рд╣реЛрдгреЗ
  • рд╕реНрдкрд╛рд░реНрдХрдиреЗ рдЯрд╛рдЗрдк рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реНрддреНрд░реЛрдд рдбреЗрдЯрд╛рдордзреАрд▓ рд░рд┐рдХрд╛рдореНрдпрд╛ рдлреАрд▓реНрдбрд╕рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рд╛
  • рд╕реНрдЯреНрд░рд┐рдВрдЧрд╡рд░ рд╕рд╛рдзреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛рд╕реНрдЯ рдХрд░рд╛
  • рдлреАрд▓реНрдбрдЪреА рдирд╛рд╡реЗ рд▓реЛрдЕрд░рдХреЗрд╕рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рд╛
  • Hive рдордзреНрдпреЗ рд╕реНрд╡рддрдВрддреНрд░ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдЖрдгрд┐ рдЯреЗрдмрд▓ рдиреЛрдВрджрдгреА (DDL рдЬрдирд░реЗрд╢рди)
  • Hive рд╢реА рд╡рд┐рд╕рдВрдЧрдд рдЕрд╕реВ рд╢рдХрдгрд╛рд░реНтАНрдпрд╛ рдлреАрд▓реНрдбрдЪреА рдирд╛рд╡реЗ рдЯрд╛рд│рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛
  • Hive рдордзреНрдпреЗ рдЯреЗрдмрд▓ рдиреЛрдВрджрдгреА рдХрд╢реА рдЕрдкрдбреЗрдЯ рдХрд░рд╛рдпрдЪреА рддреЗ рдЬрд╛рдгреВрди рдШреНрдпрд╛

рд╕рд╛рд░рд╛рдВрд╢, рдЖрдореНрд╣реА рд▓рдХреНрд╖рд╛рдд рдШреЗрддреЛ рдХреА рджреБрдХрд╛рдирд╛рдЪреНрдпрд╛ рдЦрд┐рдбрдХреНрдпрд╛ рдмрд╛рдВрдзрдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдЕрдиреЗрдХ рдЕрдбрдЪрдгреАрдВрдиреА рднрд░рд▓реЗрд▓рд╛ рдЖрд╣реЗ. рдореНрд╣рдгреВрди, рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдордзреНрдпреЗ рдЕрдбрдЪрдгреА рдЖрд▓реНрдпрд╛рд╕, рдпрд╢рд╕реНрд╡реА рддрдЬреНрдЮ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЕрдиреБрднрд╡реА рднрд╛рдЧреАрджрд╛рд░рд╛рд╢реА рд╕рдВрдкрд░реНрдХ рд╕рд╛рдзрдгреЗ рдЪрд╛рдВрдЧрд▓реЗ.

рд╣рд╛ рд▓реЗрдЦ рд╡рд╛рдЪрд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж, рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рддреА рдЙрдкрдпреБрдХреНрдд рд╡рд╛рдЯрд▓реА.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛