web-dev-qa-db-fra.com

Spark 2.0: chemin relatif en URI absolu (spark-warehouse)

J'essaie de migrer de Spark 1.6.1 vers Spark 2.0.0 et j'obtiens une erreur étrange lorsque j'essaie de lire un fichier csv dans SparkSQL) Auparavant, lorsque je lisais un fichier depuis un disque local dans pyspark, je faisais:

Spark 1.6

df = sqlContext.read \
        .format('com.databricks.spark.csv') \
        .option('header', 'true') \
        .load('file:///C:/path/to/my/file.csv', schema=mySchema)

Dans la dernière version, je pense que cela devrait ressembler à ceci:

Spark 2.

spark = SparkSession.builder \
           .master('local[*]') \
           .appName('My App') \
           .getOrCreate()

df = spark.read \
        .format('csv') \
        .option('header', 'true') \
        .load('file:///C:/path/to/my/file.csv', schema=mySchema)

Mais j'obtiens cette erreur, peu importe combien de façons différentes j'essaie d'ajuster le chemin:

IllegalArgumentException: 'Java.net.URISyntaxException: Relative path in 
absolute URI: file:/C:/path//to/my/file/spark-warehouse'

Je ne sais pas s'il s'agit simplement d'un problème avec Windows ou s'il manque quelque chose. J'étais ravi que le paquet spark-csv fasse maintenant partie de Spark dès la sortie de la boîte, mais je n'arrive plus à le faire lire mes fichiers locaux. ?

16
Disco4Ever

J'ai pu fouiller dans la dernière documentation Spark, et j'ai remarqué qu'ils ont un nouveau paramètre de configuration que je n'avais pas remarqué auparavant:

spark.sql.warehouse.dir

J'ai donc continué et ajouté ce paramètre lors de la configuration de ma SparkSession:

spark = SparkSession.builder \
           .master('local[*]') \
           .appName('My App') \
           .config('spark.sql.warehouse.dir', 'file:///C:/path/to/my/') \
           .getOrCreate()

Cela semble définir le répertoire de travail, puis je peux simplement introduire mon nom de fichier directement dans le lecteur csv:

df = spark.read \
        .format('csv') \
        .option('header', 'true') \
        .load('file.csv', schema=mySchema) 

Une fois que j'ai défini l'entrepôt spark, Spark a réussi à localiser tous mes fichiers et mon application se termine avec succès maintenant. La chose étonnante est qu'elle fonctionne environ 20 fois plus vite que dans Spark 1.6. Ils ont donc vraiment fait un travail très impressionnant pour optimiser leur moteur SQL. Spark it up!

27
Disco4Ever