2016-08-11 8 views
8

मैं एक json फ़ाइल, nodes है कि इस तरह दिखता है:पढ़ना JSON - `corrupt_record`

[{"toid":"osgb4000000031043205","point":[508180.748,195333.973],"index":1} 
,{"toid":"osgb4000000031043206","point":[508163.122,195316.627],"index":2} 
,{"toid":"osgb4000000031043207","point":[508172.075,195325.719],"index":3} 
,{"toid":"osgb4000000031043208","point":[508513,196023],"index":4}] 

मैंने पढ़ा है और अजगर के साथ इस रिकॉर्ड में हेरफेर करने में सक्षम हूँ।

मैं इस फ़ाइल को scala में spark-shell के माध्यम से पढ़ने की कोशिश कर रहा हूं।

इस tutorial से, मैं देख सकता हूँ कि यह माध्यम से sqlContext.read.json

val vfile = sqlContext.read.json("path/to/file/nodes.json") 

हालांकि json पढ़ने के लिए संभव है, यह एक corrupt_record त्रुटि में परिणाम है:

vfile: org.apache.spark.sql.DataFrame = [_corrupt_record: string] 

किसी को भी इस पर कुछ प्रकाश डाला सकता है त्रुटि? मैं अन्य अनुप्रयोगों के साथ फ़ाइल को पढ़ और उपयोग कर सकता हूं और मुझे विश्वास है कि यह भ्रष्ट और ध्वनि json नहीं है।

उत्तर

11

स्पार्क शीर्ष स्तर पर एक रिकॉर्ड करने के लिए JSON सरणी नहीं पढ़ सकते हैं, तो आप पारित करने के लिए है:

Let's begin by loading a JSON file, where each line is a JSON object

:

{"toid":"osgb4000000031043205","point":[508180.748,195333.973],"index":1} 
{"toid":"osgb4000000031043206","point":[508163.122,195316.627],"index":2} 
{"toid":"osgb4000000031043207","point":[508172.075,195325.719],"index":3} 
{"toid":"osgb4000000031043208","point":[508513,196023],"index":4} 

यह the tutorial में वर्णित के रूप में आप की बात कर रहे हैं तर्क काफी सरल है। स्पार्क आपको उम्मीद करता है कि आप कई JSON-entities के साथ एक फ़ाइल पास कर सकते हैं, इसलिए यह उनकी प्रसंस्करण (प्रति इकाई, मोटे तौर पर कह रहा है) वितरित कर सकता है। इसलिए यही कारण है कि यह किसी इकाई को शीर्ष-स्तर पर पार्स करने की अपेक्षा करता है लेकिन एक सरणी प्राप्त करता है, जो रिकॉर्ड को मैप करना असंभव है क्योंकि इस तरह के कॉलम के लिए कोई नाम नहीं है। असल में (लेकिन सटीक नहीं) स्पार्क आपकी सरणी को एक पंक्ति के साथ एक पंक्ति के रूप में देख रहा है और उस कॉलम के लिए नाम ढूंढने में विफल रहता है।

उस पर और अधिक प्रकाश में कहें, यहाँ एक उद्धरण फार्म the official doc

Note that the file that is offered as a json file is not a typical JSON file. Each line must contain a separate, self-contained valid JSON object. As a consequence, a regular multi-line JSON file will most often fail.

इस प्रारूप अक्सर JSONL कहा जाता है। असल में यह सीएसवी का विकल्प है।

+0

धन्यवाद @ dl14। मुझे अधिक गहराई में इनपुट फ़ाइलों को तैयार करने के बारे में सोचना होगा – LearningSlowly

+1

आगंतुक: सुनिश्चित करें कि आप इस उत्तर का अंतिम भाग पढ़ लें: "ध्यान दें कि जेएसएस फ़ाइल के रूप में पेश की जाने वाली फ़ाइल एक सामान्य JSON फ़ाइल नहीं है प्रत्येक पंक्ति में एक अलग, स्वयं निहित वैध JSON ऑब्जेक्ट होना चाहिए। परिणामस्वरूप, नियमित बहु-पंक्ति JSON फ़ाइल अक्सर असफल हो जाती है। " –

0

मैं एक ही समस्या में भागता हूं।

val jsonRDD = sc.wholeTextFiles(JSON).map(x => x._2) 

आप के लिए एक स्कीमा बना सकते हैं: - फ़ाइल

val conf = new SparkConf() 
    .setMaster("local[1]") 
    .setAppName("Simple Application") 


val sc = new SparkContext(conf) 

val spark = SparkSession 
    .builder() 
    .config(conf) 
    .getOrCreate() 

फिर चिंगारी संदर्भ मैं पूरी json पढ़ का उपयोग कर (फाइल करने के लिए पथ JSON),: मैं एक ही विन्यास पर sparkContext और sparkSql इस्तेमाल किया भविष्य का चयन, फ़िल्टर ...

val schema = StructType(List(
    StructField("toid", StringType, nullable = true), 
    StructField("point", ArrayType(DoubleType), nullable = true), 
    StructField("index", DoubleType, nullable = true) 
)) 

एक DataFrame का उपयोग कर चिंगारी एसक्यूएल बनाएँ:

var df: DataFrame = spark.read.schema(schema).json(jsonRDD).toDF() 

परीक्षण उपयोग शो के लिए और printSchema:

df.show() 
df.printSchema() 

एसबीटी निर्माण फ़ाइल:

name := "spark-single" 

version := "1.0" 

scalaVersion := "2.11.7" 

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.2" 
libraryDependencies +="org.apache.spark" %% "spark-sql" % "2.0.2" 
4

बहु पढ़ने के लिए डेटाफ्रेम के रूप में जेएसओएनलाइन करें:

val spark = SparkSession.builder().getOrCreate() 

val df = spark.read.json(spark.sparkContext.wholeTextFiles("file.json").values) 

इस तरह से बड़ी फ़ाइलों को पढ़ना अनुशंसित नहीं है, से wholeTextFiles docs

Small files are preferred, large file is also allowable, but may cause bad performance.

+0

बहुत बढ़िया ... धन्यवाद Datageek। आपकी पोस्ट ने वास्तव में मेरी मदद की .. –

संबंधित मुद्दे