рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдХреАрдорд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╡рд┐рдХрд╛рд╕

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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдирд┐рдпреЛрдлреНрд▓реЗрдХреНрд╕ рдХреЗ рдмрд┐рдЧ рдбреЗрдЯрд╛ рд╕реЙрд▓реНрдпреВрд╢рдВрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрдЧреНрд░рдгреА рд╕рд▓рд╛рд╣рдХрд╛рд░ рдиреЗ рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрд░рдЪрдирд╛ рд╢реЛрдХреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред

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

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

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓рдХреНрд╖реНрдп рд╕реНрдЯреЛрд░рдлреНрд░рдВрдЯ рдХрд╛ рд╕реНрдХреАрдорд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпреЛрдЬрдирд╛ рднреА рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдФрд░ рд╣рдо рдЗрди рдмрд╣реБрдд рд╣реА рдвреАрд▓реЗ-рдврд╛рд▓реЗ рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рд╕реЗ рдирд┐рдкрдЯ рд░рд╣реЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЬ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реЙрдЧ рдХреА рдЧрдИ рд╣реИ:

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

рдФрд░ рдХрд▓ рдЙрд╕реА рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрддреНрддрд░ рдЖрдПрдЧрд╛:

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

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╢реЛрдХреЗрд╕ рдореЗрдВ рдПрдХ рдФрд░ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╡рд┐рд╡рд░рдг, рдФрд░ рдХреЛрдИ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдпрд╣ рдЖрдПрдЧрд╛ рдпрд╛ рдирд╣реАрдВред

рдРрд╕реЗ рдбреЗрдЯрд╛ рдкрд░ рд╕реНрдЯреЛрд░рдлреНрд░рдВрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд╛рдлреА рдорд╛рдирдХ рд╣реИ, рдФрд░ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдХрд░рдг рд╣реИрдВред рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, JSON рдФрд░ XML рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдЬреНрдЮрд╛рдд рд╕реНрдХреАрдорд╛ рдХреЗ рд▓рд┐рдП, schemaEvolution рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╕рдорд╛рдзрд╛рди рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ. рдЖрдкрдХреЛ JSON рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдореЗрдВ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред рд╕реНрдкрд╛рд░реНрдХ рдПрдХ рд╕реНрдХреАрдорд╛ рдмрдирд╛рдПрдЧрд╛, рдиреЗрд╕реНрдЯреЗрдб рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд░ рдЪреАрдЬ рдХреЛ рд▓рдХрдбрд╝реА рдХреА рдЫрдд рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреЛ рдХрд┐ рд╣рд╛рдЗрд╡ рдореЗрдЯрд╛рд╕реНрдЯреЛрд░ рдореЗрдВ рд╕реНрдЯреЛрд░рдлреНрд░рдВрдЯ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдХреЗ рдЗрдореНрдкрд╛рд▓рд╛ рдореЗрдВ рднреА рд╕рдорд░реНрдерд┐рдд рд╣реИред

рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ.

рд╣рд╛рд▓рд╛рдБрдХрд┐, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реНрдЯреЛрд░рдлреНрд░рдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ 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 рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдХреЛ рд▓рдХрдбрд╝реА рдХреА рдЫрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рд╣рд╛рдЗрд╡ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ:

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 + "/")

рд╕реНрдХреАрдорд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рд╣рд╛рдЗрд╡ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣реАрдВ рд╕рдорд╕реНрдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред

рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛. рджреЗрд░-рд╕рдмреЗрд░, рдкрд░рд┐рдгрд╛рдореА рд▓рдХрдбрд╝реА рдХреА рдЫрдд рдЕрдкрдардиреАрдп рд╣реЛ рдЬрд╛рдПрдЧреАред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд▓рдХрдбрд╝реА рдХреА рдЫрдд рдФрд░ JSON рдЦрд╛рд▓реА рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

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

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

рдФрд░ рдЖрдЬ рд╡рд╣реА JSON рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

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

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

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)

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд┐рднрд╛рдЬрди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХрд▓ рдбреЗрдЯрд╛рдлреНрд░реЗрдо рдФрд░ рдкреВрд░реЗ рд╢реЛрдХреЗрд╕ рдХреЗ рд╡реИрдз рдкреИрд░рд╛рдХреЗрдЯ рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рдБ? рдирд╣реАрдВред

рд╣рдореЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдордиреЗ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╣рд╛рдЗрд╡ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИред рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдореЗрдВ рд╣рд╛рдЗрд╡ рдХреЗрд╕ рд╕рдВрд╡реЗрджреА рдирд╣реАрдВ рд╣реИ, рдЬрдмрдХрд┐ рд▓рдХрдбрд╝реА рдХреА рдЫрдд рдХреЗрд╕ рд╕рдВрд╡реЗрджреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕реНрдХреАрдорд╛ рд╡рд╛рд▓реЗ рд╡рд┐рднрд╛рдЬрди: рдлрд╝реАрд▓реНрдб1: int, рдФрд░ рдлрд╝реАрд▓реНрдб1: int рд╣рд╛рдЗрд╡ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреЛ рд▓реЛрдЕрд░рдХреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред

рдЙрд╕рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИ.

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

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рд╣рд░ рджрд┐рди рд▓рдХреНрд╖реНрдп рд╢реЛрдХреЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреИрд░рд╛рдХреНрд╡реЗрдЯ рд╡рд┐рднрд╛рдЬрди рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рджрд┐рди рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрд╛ рдХрд┐ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯрдХрд░рд╛рд╡ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд┐рднрд╛рдЬрди рди рд╣реЛред

рд▓реЗрдХрд┐рди, рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдПрдХ рддреАрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рд╣реИ. рдЕрдм рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХреАрдорд╛ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд╛рдЗрд╡ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдЧрд▓рдд рд╕реНрдХреАрдорд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирдП рд╡рд┐рднрд╛рдЬрди рд╕реЗ рд╕реНрдХреАрдорд╛ рдореЗрдВ рд╡рд┐рдХреГрддрд┐ рдЖрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

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

рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдЪреМрдереА рд╕рдорд╕реНрдпрд╛ рд╣реИ. рдЬрдм рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдЬреАрдХреГрдд рдХреА, рддреЛ рд╣рдордиреЗ рд╕реНрдкрд╛рд░реНрдХ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд┐рдпрд╛ред рдЕрдм рд╣рдо рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд▓рдХрдбрд╝реА рдХреЗ рдХреНрд╖реЗрддреНрд░ рдРрд╕реЗ рдкрд╛рддреНрд░реЛрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рд╛рдЗрд╡ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдкрд╛рд░реНрдХ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╣ "correct_record" рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдРрд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рднрд╛рдЧрдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╣рд╛рдЗрд╡ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдЬрд╛рдирдиреЗ рдкрд░, рд╣рдореЗрдВ рдпреЛрдЬрдирд╛ рдорд┐рд▓рддреА рд╣реИ:

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)

рдХреЛрдб ("_рдХрд░рдкреНрдЯ_рд░рд┐рдХреЙрд░реНрдб", "`_рдХрд░рдкреНрдЯ_рд░рд┐рдХреЙрд░реНрдб`") + " " + рдПрдл[1].рд░рд┐рдкреНрд▓реЗрд╕(":", "`:").рд░рд┐рдкреНрд▓реЗрд╕("<", "<`").рд░рд┐рдкреНрд▓реЗрд╕(",, ",`").рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди("рд╕рд░рдгреА<`", "рд╕рд░рдгреА<") рд╕реБрд░рдХреНрд╖рд┐рдд DDL рдмрдирд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:

create table tname (_field1 string, 1field string)

"_рдлрд╝реАрд▓реНрдб1, 1рдлрд╝реАрд▓реНрдб" рдЬреИрд╕реЗ рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде, рд╕реБрд░рдХреНрд╖рд┐рдд рдбреАрдбреАрдПрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдлрд╝реАрд▓реНрдб рдирд╛рдо рдмрдЪ рдЬрд╛рддреЗ рд╣реИрдВ: рддрд╛рд▓рд┐рдХрд╛ `tname` (`_рдлрд╝реАрд▓реНрдб1` рд╕реНрдЯреНрд░рд┐рдВрдЧ, `1рдлрд╝реАрд▓реНрдб` рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдмрдирд╛рдПрдВред

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

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬрд╝ рдореМрдЬреВрдж рд╣реИ: рд╣рд╛рдЗрд╡ рдореЗрдВ рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рд╕реНрдХреАрдорд╛ рдФрд░ рдирдпрд╛ рд╡рд┐рднрд╛рдЬрдиред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рднреА рд╣реИ. рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдирдИ рд╕реНрдХреАрдорд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ рдЬреЛ рд╕реНрдЯреЛрд░рдлреНрд░рдВрдЯ рд╕реНрдХреАрдорд╛ рдФрд░ рдмрдирд╛рдП рдЧрдП рд╡рд┐рднрд╛рдЬрди рд╕реЗ рдирдП рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ:

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/*")

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд┐рдЫрд▓реЗ рд╕реНрдирд┐рдкреЗрдЯ рдХреА рддрд░рд╣, рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдЬреАрдХрд░рдг рдбреАрдбреАрдПрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
рдпрджрд┐ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдб рдерд╛, рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рд╣рд╛рдЗрд╡ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдереА, рддреЛ рд╣рдореЗрдВ рдПрдХ рдЕрджреНрдпрддрди рддрд╛рд▓рд┐рдХрд╛ рд╕реНрдХреАрдорд╛ рдорд┐рд▓рддреА рд╣реИред

рдФрд░ рдЖрдЦрд┐рд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╣рд╛рдЗрд╡ рдЯреЗрдмрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рднрд╛рдЬрди рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЛ рд╣рд╛рдЗрд╡ рдХреЛ рдЙрд╕рдХреА рд╡рд┐рднрд╛рдЬрди рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

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

JSON рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдЯреЛрд░рдлреНрд░рдВрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдкрд░ рдХрд╛рдмреВ рдкрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдХреЗ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЛ рдЕрд▓рдЧ рд╕реЗ рддрд▓рд╛рд╢рдиреЗ рд╣реЛрдВрдЧреЗред рдФрд░ рдпрджреНрдпрдкрд┐ рдпреЗ рд╕рдорд╛рдзрд╛рди рд╕рд░рд▓ рд╣реИрдВ, рдлрд┐рд░ рднреА рдЗрдиреНрд╣реЗрдВ рдвреВрдВрдврдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

рд╢реЛрдХреЗрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпрд╣ рдХрд░рдирд╛ рдерд╛:

  • рд╕реЗрд╡рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдХрд░, рд╢реЛрдХреЗрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдЬреЛрдбрд╝реЗрдВ
  • рд╕реНрдкрд╛рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдореЗрдВ рдЦрд╛рд▓реА рдлрд╝реАрд▓реНрдб рд╕реЗ рдирд┐рдкрдЯреЗрдВ
  • рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдХрд╛рд╕реНрдЯ рдХрд░реЗрдВ
  • рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рдХреЛ рд▓реЛрдЕрд░рдХреЗрд╕ рдореЗрдВ рдмрджрд▓реЗрдВ
  • рд╣рд╛рдЗрд╡ рдореЗрдВ рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдФрд░ рдЯреЗрдмрд▓ рдкрдВрдЬреАрдХрд░рдг (рдбреАрдбреАрдПрд▓ рдкреАрдврд╝реА)
  • рдЙрди рдлрд╝реАрд▓реНрдб рдирд╛рдореЛрдВ рд╕реЗ рдмрдЪрдирд╛ рди рднреВрд▓реЗрдВ рдЬреЛ рд╣рд╛рдЗрд╡ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
  • рдЬрд╛рдиреЗрдВ рдХрд┐ рд╣рд╛рдЗрд╡ рдореЗрдВ рдЯреЗрдмрд▓ рдкрдВрдЬреАрдХрд░рдг рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреБрдХрд╛рди рдХреА рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рдХрдИ рдиреБрдХрд╕рд╛рдиреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдлрд▓ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╡реА рднрд╛рдЧреАрджрд╛рд░ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧреАред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ