Игнорировать строки, в которых нет правильного регистра, а затем рассчитать процент - PullRequest
0 голосов
/ 13 мая 2019

Для универа мне нужно проанализировать список паролей, который выглядит примерно так:

username1@provider1.ch
username2@provider1.ch
username3@provider2.ch
....

Я запрашиваю свои данные на Zeppelin, где я создал TempView с именем pwned. В следующих параграфах я использую интерпретатор %sql для запроса TempView.

%pyspark
from pyspark.sql.types import (StructField, StringType, StructType)
df = spark.read.format("csv").option("delimiter", "\t").load('/user/zeppelin/part-m-00000').toDF("username","password")
df.createOrReplaceTempView("pwned")

Например, вот 10 самых популярных паролей для Швейцарии: enter image description here

Я бы хотел добиться запроса, в котором я отфильтровал список TLD и посчитал их. Так что-то вроде этого:

|---------------------|------------------|
|      Country        |       Count      |
|---------------------|------------------|
|      %@%.ch         |         12       |
|---------------------|------------------|
|      %@%.com        |         122      |
|---------------------|------------------|

Как бы я достиг этого, используя Spark SQL?

Я также смотрю на наиболее уязвимых поставщиков бесплатной электронной почты в Швейцарии. Запрос также возвращает все случаи, которые не равны нулю, и добавляет их в список. Есть ли способ игнорировать это? Кроме того, как мне рассчитать процент записей?

%sql
SELECT
  CASE
    WHEN username LIKE '%@bluewin.ch' THEN 'Bluewin'
    WHEN username LIKE '%@hotmail.ch' THEN 'Hotmail'
    WHEN username LIKE '%@gmx.ch' THEN 'GMX'
    WHEN username LIKE '%@hispeed.ch' THEN 'Hispeed'
    WHEN username LIKE '@epost.ch' THEN 'Epost'
  END AS Provider
, COUNT(*) AS Count
, COUNT(username LIKE '@....ch')/COUNT(*) AS Percentage
FROM pwned
GROUP BY 
  CASE
    WHEN username LIKE '%@bluewin.ch' THEN 'Bluewin'
    WHEN username LIKE '%@hotmail.ch' THEN 'Hotmail'
    WHEN username LIKE '%@gmx.ch' THEN 'GMX'
    WHEN username LIKE '%@hispeed.ch' THEN 'Hispeed'
    WHEN username LIKE '@epost.ch' THEN 'Epost'
  END

Результат, который я получаю из запроса выше: enter image description here

Спасибо за любые предложения или помощь!

...