2016-07-02 5 views
2

Ich lese eine große Sammlung von Textdateien in einem DataFrame. Anfangs wird es nur eine Spalte haben, value. Die Textdateien verwenden HTML-Codierung (d. H. Sie haben &lt; anstelle von < usw.). Ich möchte sie alle zu normalen Charakteren dekodieren.Wie dekodieren HTML-Entitäten in Spark?

Offensichtlich könnte ich es mit einem UDF tun, aber es wäre super langsam.

Ich könnte regexp_replace versuchen, aber es wäre noch langsamer, da es über 200 benannte Entitäten gibt, und jeder würde seine eigene Regexp-Funktion benötigen. Jeder regexp_replace-Aufruf muss die gesamte Textzeile analysieren und nach jeweils einem bestimmten codierten Zeichen suchen.

Was ist ein guter Ansatz?

+1

ich den 'regexp_replace' Ansatz würde –

+0

@AlbertoBonsanto es nicht funktioniert, habe ich Angst. Ich habe die Frage aktualisiert, um darüber zu sprechen. Es gibt [200+ benannte Entitäten] (https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references). So viele regexp_replace wird so langsam sein, dass es wahrscheinlich schneller ist, nur eine UDF mit einem Wörterbuch, das die Umwandlung Karte speichert. – max

+0

Language-Tag wäre hier nützlich .. Im Allgemeinen UDFs sind nicht die erste Wahl, aber insgesamt sind diese nicht "super" langsam (er), obwohl andere damit verbundenen Kosten abhängig von einer Sprache und Spark-Version. – zero323

Antwort

1

Da Sie Klartexteingabe lesen, würde ich einfach UDF-Teil überspringen und Daten nach der ersten Verarbeitung zu JVM übergeben. Mit Python 3.4+:

import html 
from pyspark.sql.types import StringType, StructField, StructType 

def clean(s): 
    return html.unescape(s), 

(sc.textFile("README.md") 
    .map(clean) 
    .toDF(StructType([StructField("value", StringType(), False)]))) 
+0

Also es erfordert immer noch Daten von Python zu JVM zu bewegen, aber zumindest nicht beide Richtungen wie im Fall von UDF richtig? – max

+0

Ja, es betrifft SerDe aktiv wenn Daten an DataFrame übergeben werden. Auf der anderen Seite erfordert es keine zusätzlichen Abhängigkeiten, so dass es einen Gewinn nach allem bekommen kann :) Und die Wahrheit gesagt, wenn Sie nicht planen, etwas über striktes DataFrame hinaus zu verwenden, macht PySpark wenig Sinn. – zero323